Amazon Redshift から ClickHouse への移行ガイド
はじめに
Amazon Redshift は、Amazon Web Services が提供する広く利用されているクラウド型データウェアハウスソリューションです。このガイドでは、Redshift インスタンスから ClickHouse へデータを移行するための複数のアプローチを紹介します。ここでは次の 3 つの選択肢を取り上げます。

ClickHouse インスタンス側の観点からは、次のいずれかの方法を取ることができます。
-
サードパーティの ETL/ELT ツールまたはサービスを使用して、PUSH 方式で ClickHouse にデータを送信する
-
ClickHouse JDBC Bridge を利用して、PULL 方式で Redshift からデータを取得する
-
S3 オブジェクトストレージを使用して、PIVOT 方式の「アンロードしてからロードする」ロジックでデータを移行する
このチュートリアルでは、データソースとして Redshift を使用しています。ただし、ここで紹介する移行アプローチは Redshift 専用ではなく、互換性のある任意のデータソースにも同様の手順を適用できます。
Redshift から ClickHouse へデータをプッシュする
プッシュシナリオでは、サードパーティのツールやサービス(カスタムコードまたは ETL/ELT)を活用して、データを ClickHouse インスタンスに送信します。たとえば、Airbyte のようなソフトウェアを使用して、Redshift インスタンス(ソース)から ClickHouse(宛先)へデータを移動できます(Airbyte 向けの連携ガイドを参照してください)。

利点
- ETL/ELT ソフトウェアが提供する既存のコネクタカタログを活用できます。
- データを同期状態に保つための機能(追加 / 上書き / インクリメンタル処理ロジック)が組み込まれています。
- データ変換シナリオを実現できます(例として、dbt 向けの連携ガイドを参照してください)。
欠点
- ユーザーは ETL/ELT インフラストラクチャをセットアップして維持する必要があります。
- アーキテクチャにサードパーティ要素を導入することで、潜在的なスケーラビリティのボトルネックになり得ます。
RedshiftからClickHouseへのデータプル
プルシナリオでは、ClickHouse JDBC Bridgeを活用してClickHouseインスタンスからRedshiftクラスタに直接接続し、INSERT INTO ... SELECTクエリを実行します。

利点
- すべてのJDBC互換ツールに汎用的に対応
- ClickHouse内から複数の外部データソースをクエリできるエレガントなソリューション
欠点
- ClickHouse JDBC Bridgeインスタンスが必要であり、スケーラビリティのボトルネックになる可能性がある
RedshiftはPostgreSQLをベースにしていますが、ClickHouseはPostgreSQLバージョン9以上を必要とし、Redshift APIはそれ以前のバージョン(8.x)に基づいているため、ClickHouseのPostgreSQLテーブル関数またはテーブルエンジンを使用することはできません。
チュートリアル
このオプションを使用するには、ClickHouse JDBC Bridgeをセットアップする必要があります。ClickHouse JDBC Bridgeは、JDBC接続を処理し、ClickHouseインスタンスとデータソース間のプロキシとして機能するスタンドアロンのJavaアプリケーションです。このチュートリアルでは、サンプルデータベースが事前に投入されたRedshiftインスタンスを使用しました。
ClickHouse JDBC Bridgeのデプロイ
ClickHouse JDBC Bridgeをデプロイします。詳細については、外部データソース用JDBCのユーザーガイドを参照してください。
ClickHouse Cloudを使用している場合は、ClickHouse JDBC Bridgeを別の環境で実行し、remoteSecure関数を使用してClickHouse Cloudに接続する必要があります。
Redshiftデータソースの設定
ClickHouse JDBC Bridge用にRedshiftデータソースを設定します。例:/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json
ClickHouseからRedshiftインスタンスへのクエリ
ClickHouse JDBC Bridgeがデプロイされ実行されると、ClickHouseからRedshiftインスタンスへのクエリを開始できます。
S3 を使用して Redshift から ClickHouse へデータをピボットする
このシナリオでは、中間のピボット形式でデータを S3 にエクスポートし、2 段階目で S3 から ClickHouse にデータをロードします。

利点
- Redshift と ClickHouse の両方が強力な S3 連携機能を備えています。
- Redshift の
UNLOADコマンドや ClickHouse の S3 テーブル関数 / テーブルエンジンなど、既存の機能を活用できます。 - ClickHouse と S3 間の並列読み取りおよび高スループット機能により、シームレスにスケールします。
- Apache Parquet のような高度かつ圧縮された形式を活用できます。
欠点
- 処理が 2 段階(Redshift からのアンロード、その後 ClickHouse へのロード)になります。
チュートリアル
ClickHouse にテーブルを作成する
ClickHouse にテーブルを作成します。
あるいは、ClickHouse は CREATE TABLE ... EMPTY AS SELECT を使用してテーブル構造を推測することもできます。
この方法は、Parquet のようにデータ型に関する情報を含む形式でデータが存在する場合に特に有効です。
S3 ファイルを ClickHouse にロードする
INSERT INTO ... SELECT 文を使用して、S3 ファイルを ClickHouse にロードします。
この例ではピボット形式として CSV を使用しています。しかし、本番ワークロードでは、大規模な移行では Apache Parquet を最適な選択肢として推奨します。圧縮機能を備えており、ストレージコストを削減しつつ転送時間も短縮できるためです。(デフォルトでは、各ロウグループは SNAPPY で圧縮されます。)ClickHouse はまた、Parquet の列指向を活用してデータのインジェスト処理を高速化します。

