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

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

Introduction

Amazon Redshift は、Amazon Web Services が提供する人気のあるクラウドデータウェアハウジングソリューションです。このガイドでは、Redshift インスタンスから ClickHouse へのデータ移行のさまざまなアプローチを紹介します。以下の三つのオプションをカバーします:

Redshift to ClickHouse Migration Options

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

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

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

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

注記

このチュートリアルでは Redshift をデータソースとして使用しました。ただし、ここで示される移行方法は Redshift に限定されず、互換性のあるデータソースについても同様の手順が導き出せます。

Push Data from Redshift to ClickHouse

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

PUSH Redshift to ClickHouse

Pros

  • ETL/ELT ソフトウェアの既存のコネクタカタログを活用できる。
  • データを同期するための組み込み機能(追加/上書き/インクリメントロジック)。
  • データ変換シナリオを可能にする(例えば、dbt の統合ガイドを参照してください)。

Cons

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

Pull Data from Redshift to ClickHouse

プルシナリオでは、ClickHouse JDBC ブリッジを利用して Redshift クラスターに直接接続し、INSERT INTO ... SELECT クエリを実行することを目的としています:

PULL from Redshift to ClickHouse

Pros

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

Cons

  • ClickHouse JDBC ブリッジインスタンスが必要であり、これが潜在的なスケーラビリティのボトleneckとなる可能性がある
注記

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

Tutorial

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

Deploy ClickHouse JDBC Bridge

ClickHouse JDBC ブリッジを展開します。詳細については、外部データソース向けJDBCのユーザーガイドをご覧ください。

注記

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

Configure your Redshift datasource

ClickHouse JDBC ブリッジ用に 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
 }
}

Query your Redshift instance from ClickHouse

ClickHouse JDBC ブリッジを展開して実行後、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.

Import Data from Redshift to ClickHouse

以下に、INSERT INTO ... SELECT ステートメントを使用してデータをインポートする例を示します。


# 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.)

Pivot Data from Redshift to ClickHouse using S3

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

PIVOT from Redshift using S3

Pros

  • Redshift と ClickHouse の両方が強力な S3 統合機能を備えています。
  • Redshift の UNLOAD コマンド及び ClickHouse S3 テーブル関数 / テーブルエンジンなど、既存の機能を活用します。
  • ClickHouse の S3 への並行読み取りおよび高スループット機能によりスムーズにスケールします。
  • Apache Parquet のような高度で圧縮されたフォーマットを活用できます。

Cons

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

Tutorial

Export data into an S3 bucket using UNLOAD

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

UNLOAD from Redshift to S3

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

Data in S3

Create the table in 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)の場合に特に良く機能します。

Load S3 files into 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 の列指向を活用してデータ取り込みを高速化します。