はじめに
Amazon Redshift は、Amazon Web Services が提供する人気の高い Cloud データウェアハウジングソリューションです。このガイドでは、Redshift インスタンスから ClickHouse へデータを移行するためのさまざまな方法を紹介します。ここでは、次の 3 つの選択肢を取り上げます。

ClickHouse インスタンスの観点では、次のいずれかの方法を選べます。
-
PUSH サードパーティの ETL/ELT ツールまたはサービスを使用して、データを ClickHouse に送る
-
PULL ClickHouse JDBC Bridge を利用して、Redshift からデータを取得する
-
PIVOT S3 オブジェクトストレージを使用し、「アンロードしてからロードする」方式を用いる
プッシュ方式で Redshift から ClickHouse にデータを送る
プッシュ方式では、サードパーティ製のツールやサービス (カスタムコード、または ETL/ELT) を利用して、データを ClickHouse インスタンスに送信します。たとえば、Airbyte のようなソフトウェアを使えば、Redshift インスタンスをソース、ClickHouse を宛先としてデータを移動できます (Airbyte のインテグレーションガイドを参照してください)

長所
- ETL/ELT ソフトウェアに既存するコネクタのカタログを活用できます。
- データの同期を維持するための組み込み機能 (append/overwrite/increment ロジック) を備えています。
- データ変換のユースケースに対応できます (例: dbt のインテグレーションガイド を参照) 。
欠点
- ETL/ELTインフラストラクチャの構築と運用が必要です。
- アーキテクチャにサードパーティの要素が加わるため、スケーラビリティ上のボトルネックになる可能性があります。
Redshift から ClickHouse へデータを Pull する
Pull シナリオでは、ClickHouse JDBC Bridge を活用して ClickHouse インスタンスから Redshift クラスターに直接接続し、INSERT INTO ... SELECT クエリを実行します。

長所
- すべてのJDBC対応ツールで利用可能
- ClickHouse内から複数の外部データソースにクエリできる、スマートなソリューション
欠点
- ClickHouse JDBC Bridgeのインスタンスが必要で、スケーラビリティのボトルネックになる可能性があります
チュートリアル
このオプションを使用するには、ClickHouse JDBC Bridge をセットアップする必要があります。ClickHouse JDBC Bridge は、JDBC 接続を処理し、ClickHouse インスタンスとデータソースの間でプロキシとして機能する、スタンドアロンの Java アプリケーションです。このチュートリアルでは、サンプルデータベース があらかじめ投入された Redshift インスタンスを使用しました。
ClickHouse JDBC Bridge をデプロイする
ClickHouse JDBC Bridge をデプロイします。詳細については、外部データソース向け JDBC に関するユーザーガイドを参照してください
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 つのカラムを持つテーブルを作成
CREATE TABLE users_imported
(
`username` String,
`firstname` String,
`lastname` String
)
ENGINE = MergeTree
ORDER BY firstnameQuery 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 にデータを Pivot
このシナリオでは、まずデータを中間の PIVOT フォーマットで S3 にエクスポートし、次に S3 から ClickHouse にデータを読み込みます。

利点
- Redshift と ClickHouse は、どちらも強力な S3 連携機能を備えています。
- Redshift の
UNLOADコマンドや、ClickHouse の S3 テーブル関数 / テーブルエンジン など、既存の機能を活用できます。 - ClickHouse は、S3 との間での並列読み取りと高スループット性能により、シームレスにスケールできます。
- Apache Parquet のような高度で圧縮効率の高いフォーマットを活用できます。
デメリット
- プロセスが2段階になります (Redshift からアンロードして、その後 ClickHouse にロードする必要があります) 。
チュートリアル
UNLOAD を使用してデータを S3 バケットにエクスポートする
ClickHouse にテーブルを作成する
ClickHouse にテーブルを作成します。
CREATE TABLE users
(
username String,
firstname String,
lastname String
)
ENGINE = MergeTree
ORDER BY usernameまたは、CREATE TABLE ... EMPTY AS SELECT を使用して、ClickHouse にテーブル構造を推定させることもできます。
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.)
