メインコンテンツまでスキップ
メインコンテンツまでスキップ

RedshiftからClickHouseへのデータ移行

はじめに

Amazon Redshift は、Amazon Web Services の一部である人気のクラウドデータウェアハウジングソリューションです。このガイドでは、RedshiftインスタンスからClickHouseへのデータ移行の異なるアプローチを紹介します。以下の3つの選択肢を扱います。

RedshiftからClickHouseへの移行オプション

ClickHouseインスタンスの視点からは、以下のいずれかを行うことができます:

  1. PUSH データをClickHouseにプッシュする、サードパーティのETL/ELTツールまたはサービスを使用して

  2. PULL ClickHouse JDBCブリッジを利用してRedshiftからデータをプルする

  3. PIVOT S3オブジェクトストレージを使用した「アンロードしてからロードする」ロジックを利用する

注記

このチュートリアルではRedshiftをデータソースとして使用しました。ただし、ここで示す移行アプローチはRedshiftに特有のものではなく、互換性のある任意のデータソースに対して同様の手順を適用できます。

RedshiftからClickHouseへのデータプッシュ

プッシュシナリオでは、サードパーティのツールまたはサービス(カスタムコードまたはETL/ELT)を活用して、データをClickHouseインスタンスに送信するアイデアです。たとえば、Airbyteというソフトウェアを使用して、Redshiftインスタンス(ソース)とClickHouse(宛先)間でデータを移動できます(Airbyteの統合ガイドを参照)。

RedshiftからClickHouseへのPUSH

メリット

  • ETL/ELTソフトウェアの既存のコネクタカタログを利用できる。
  • データの同期を保つための組み込み機能(追加/上書き/増分ロジック)。
  • データ変換のシナリオを有効にする(たとえば、dbtの統合ガイドを参照)。

デメリット

  • ユーザーはETL/ELTインフラを設定および維持する必要がある。
  • アーキテクチャにサードパーティの要素を導入するため、スケーラビリティのボトルネックになる可能性がある。

RedshiftからClickHouseへのデータプル

プルシナリオでは、ClickHouse JDBCブリッジを利用して、ClickHouseインスタンスから直接Redshiftクラスタに接続し、INSERT INTO ... SELECTクエリを実行するアイデアです:

RedshiftからClickHouseへのPULL

メリット

  • すべてのJDBC互換ツールに対して一般的である
  • ClickHouse内から複数の外部データソースをクエリするためのエレガントなソリューション

デメリット

  • スケーラビリティのボトルネックになる可能性があるClickHouse JDBCブリッジインスタンスが必要
注記

RedshiftはPostgreSQLに基づいていますが、ClickHouseのPostgreSQLテーブル関数やテーブルエンジンを使用することはできません。ClickHouseはPostgreSQLのバージョン9以上を必要とし、Redshift APIは以前のバージョン(8.x)に基づいているためです。

チュートリアル

このオプションを使用するには、ClickHouse JDBCブリッジを設定する必要があります。ClickHouse JDBCブリッジは、JDBC接続を処理し、ClickHouseインスタンスとデータソースの間のプロキシとして機能するスタンドアロンのJavaアプリケーションです。このチュートリアルでは、サンプルデータベースを持つ事前にポピュレートされたRedshiftインスタンスを使用しました。

  1. ClickHouse JDBCブリッジをデプロイします。詳細は、外部データソース用JDBCのユーザーガイドを参照してください。
注記

ClickHouse Cloudを使用している場合、ClickHouse JDBCブリッジを別の環境で実行し、remoteSecure関数を使用してClickHouse Cloudに接続する必要があります。

  1. ClickHouse JDBCブリッジ用のRedshiftデータソースを構成します。たとえば、/etc/clickhouse-jdbc-bridge/config/datasources/redshift.json
  1. ClickHouse JDBCブリッジがデプロイされ、動作している場合、ClickHouseからRedshiftインスタンスをクエリすることができます。
  1. 次に、INSERT INTO ... SELECTステートメントを使用してデータをインポートする方法を示します。

S3を使用したRedshiftからClickHouseへのデータピボット

このシナリオでは、S3に中間ピボット形式でデータをエクスポートし、次のステップでS3からClickHouseにデータをロードします。

S3を使用したRedshiftからのPIVOT

メリット

  • RedshiftとClickHouseの両方が強力なS3統合機能を持っています。
  • RedshiftのUNLOADコマンドとClickHouseのS3テーブル関数/テーブルエンジンなどの既存機能を活用できます。
  • ClickHouseにおけるS3との間での並列読み取りと高スループット機能により、シームレスにスケール可能です。
  • Apache Parquetのような高度で圧縮されたフォーマットを利用できます。

デメリット

  • プロセスに2つのステップがあります(Redshiftからのアンロード後、ClickHouseへのロード)。

チュートリアル

  1. RedshiftのUNLOAD機能を使用して、既存のプライベートS3バケットにデータをエクスポートします:

    RedshiftからS3へのUNLOAD

    これにより、生データを含む部分ファイルがS3に生成されます。

    S3のデータ
  2. ClickHouseでテーブルを作成します:

    あるいは、ClickHouseはCREATE TABLE ... EMPTY AS SELECTを使用してテーブル構造を自動推論できる場合もあります:

    これは、データがデータ型に関する情報を含む形式(パーケットなど)である場合に特に有効です。

  3. INSERT INTO ... SELECTステートメントを使用してS3ファイルをClickHouseにロードします:

注記

この例ではCSVをピボット形式として使用しました。ただし、プロダクションワークロードではApache Parquetを大規模な移行に最適なオプションとしてお勧めします。Parquetは圧縮を行い、ストレージコストを削減しつつ転送時間を短縮できます(デフォルトでは、それぞれの行グループはSNAPPYを使用して圧縮されます)。ClickHouseもParquetの列指向を利用してデータ取り込みを加速しています。