メインコンテンツへスキップ
メインコンテンツへスキップ

Amazon Redshift から ClickHouse への移行ガイド

はじめに

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

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

ClickHouse インスタンス側の観点からは、次のいずれかの方法を取ることができます。

  1. サードパーティの ETL/ELT ツールまたはサービスを使用して、PUSH 方式で ClickHouse にデータを送信する

  2. ClickHouse JDBC Bridge を利用して、PULL 方式で Redshift からデータを取得する

  3. S3 オブジェクトストレージを使用して、PIVOT 方式の「アンロードしてからロードする」ロジックでデータを移行する

注記

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

Redshift から ClickHouse へデータをプッシュする

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

PUSH Redshift to ClickHouse

利点

  • ETL/ELT ソフトウェアが提供する既存のコネクタカタログを活用できます。
  • データを同期状態に保つための機能(追加 / 上書き / インクリメンタル処理ロジック)が組み込まれています。
  • データ変換シナリオを実現できます(例として、dbt 向けの連携ガイドを参照してください)。

欠点

  • ユーザーは ETL/ELT インフラストラクチャをセットアップして維持する必要があります。
  • アーキテクチャにサードパーティ要素を導入することで、潜在的なスケーラビリティのボトルネックになり得ます。

RedshiftからClickHouseへのデータプル

プルシナリオでは、ClickHouse JDBC Bridgeを活用してClickHouseインスタンスからRedshiftクラスタに直接接続し、INSERT INTO ... SELECTクエリを実行します。

RedshiftからClickHouseへのプル

利点

  • すべての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

{
  "redshift-server": {
    "aliases": ["redshift"],
    "driverUrls": [
      "https://s3.amazonaws.com/redshift-downloads/drivers/jdbc/2.1.0.4/redshift-jdbc42-2.1.0.4.jar"
    ],
    "driverClassName": "com.amazon.redshift.jdbc.Driver",
    "jdbcUrl": "jdbc:redshift://redshift-cluster-1.ckubnplpz1uv.us-east-1.redshift.amazonaws.com:5439/dev",
    "username": "awsuser",
    "password": "<password>",
    "maximumPoolSize": 5
  }
}

ClickHouseからRedshiftインスタンスへのクエリ

ClickHouse JDBC Bridgeがデプロイされ実行されると、ClickHouseからRedshiftインスタンスへのクエリを開始できます。

SELECT *
FROM jdbc('redshift', 'select username, firstname, lastname from users limit 5')
Query id: 1b7de211-c0f6-4117-86a2-276484f9f4c0

┌─username─┬─firstname─┬─lastname─┐
│ PGL08LJI │ Vladimir  │ Humphrey │
│ XDZ38RDD │ Barry     │ Roy      │
│ AEB55QTM │ Reagan    │ Hodge    │
│ OWY35QYB │ Tamekah   │ Juarez   │
│ MSD36KVR │ Mufutau   │ Watkins  │
└──────────┴───────────┴──────────┘

5 rows in set. Elapsed: 0.438 sec.
SELECT *
FROM jdbc('redshift', 'select count(*) from sales')
Query id: 2d0f957c-8f4e-43b2-a66a-cc48cc96237b

┌──count─┐
│ 172456 │
└────────┘

1 rows in set. Elapsed: 0.304 sec.

RedshiftからClickHouseへのデータインポート

以下では、INSERT INTO ... SELECTステートメントを使用したデータインポートを示します。

# 3列でテーブルを作成 \{#table-creation-with-3-columns}
CREATE TABLE users_imported
(
   `username` String,
   `firstname` String,
   `lastname` String
)
ENGINE = MergeTree
ORDER BY firstname
Query id: c7c4c44b-cdb2-49cf-b319-4e569976ab05

Ok.

0 rows in set. Elapsed: 0.233 sec.
INSERT INTO users_imported (*) SELECT *
FROM jdbc('redshift', 'select username, firstname, lastname from users')
Query id: 9d3a688d-b45a-40f4-a7c7-97d93d7149f1

Ok.

0 rows in set. Elapsed: 4.498 sec. Processed 49.99 thousand rows, 2.49 MB (11.11 thousand rows/s., 554.27 KB/s.)

S3 を使用して Redshift から ClickHouse へデータをピボットする

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

S3 を使用した Redshift からの PIVOT

利点

  • Redshift と ClickHouse の両方が強力な S3 連携機能を備えています。
  • Redshift の UNLOAD コマンドや ClickHouse の S3 テーブル関数 / テーブルエンジンなど、既存の機能を活用できます。
  • ClickHouse と S3 間の並列読み取りおよび高スループット機能により、シームレスにスケールします。
  • Apache Parquet のような高度かつ圧縮された形式を活用できます。

欠点

  • 処理が 2 段階(Redshift からのアンロード、その後 ClickHouse へのロード)になります。

チュートリアル

UNLOAD を使用してデータを S3 バケットにエクスポートする

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

Redshift から S3 への UNLOAD

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

S3 内のデータ

ClickHouse にテーブルを作成する

ClickHouse にテーブルを作成します。

CREATE TABLE users
(
  username String,
  firstname String,
  lastname String
)
ENGINE = MergeTree
ORDER BY username

あるいは、ClickHouse は CREATE TABLE ... EMPTY AS SELECT を使用してテーブル構造を推測することもできます。

CREATE TABLE users
ENGINE = MergeTree ORDER BY username
EMPTY AS
SELECT * FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')

この方法は、Parquet のようにデータ型に関する情報を含む形式でデータが存在する場合に特に有効です。

S3 ファイルを ClickHouse にロードする

INSERT INTO ... SELECT 文を使用して、S3 ファイルを ClickHouse にロードします。

INSERT INTO users SELECT *
FROM s3('https://your-bucket.s3.amazonaws.com/unload/users/*', '<aws_access_key>', '<aws_secret_access_key>', 'CSV')
Query id: 2e7e219a-6124-461c-8d75-e4f5002c8557

Ok.

0 rows in set. Elapsed: 0.545 sec. Processed 49.99 thousand rows, 2.34 MB (91.72 thousand rows/s., 4.30 MB/s.)
注記

この例ではピボット形式として CSV を使用しています。しかし、本番ワークロードでは、大規模な移行では Apache Parquet を最適な選択肢として推奨します。圧縮機能を備えており、ストレージコストを削減しつつ転送時間も短縮できるためです。(デフォルトでは、各ロウグループは SNAPPY で圧縮されます。)ClickHouse はまた、Parquet の列指向を活用してデータのインジェスト処理を高速化します。