BigQuery から ClickHouse へのデータ読み込み
このガイドは ClickHouse Cloud およびセルフホスト型 ClickHouse v23.5+ に対応しています。
このガイドでは、BigQuery から ClickHouse にデータを移行する方法を説明します。
まずテーブルを Google のオブジェクトストレージ (GCS) にエクスポートし、その後そのデータを ClickHouse Cloud にインポートします。これらの手順は、BigQuery から ClickHouse に移行したい各テーブルごとに繰り返す必要があります。
ClickHouse へのデータエクスポートにはどのくらい時間がかかりますか?
BigQuery から ClickHouse へのデータエクスポートにかかる時間は、データセットのサイズによって異なります。参考として、このガイドを使用した場合、4TB のパブリック Ethereum データセットを BigQuery から ClickHouse にエクスポートするのに、約 1 時間かかります。
| テーブル | 行数 | エクスポートされたファイル数 | データサイズ | BigQuery エクスポート | スロット時間 | ClickHouse インポート |
|---|---|---|---|---|---|---|
| blocks | 16,569,489 | 73 | 14.53GB | 23 secs | 37 min | 15.4 secs |
| transactions | 1,864,514,414 | 5169 | 957GB | 1 min 38 sec | 1 day 8hrs | 18 mins 5 secs |
| traces | 6,325,819,306 | 17,985 | 2.896TB | 5 min 46 sec | 5 days 19 hr | 34 mins 55 secs |
| contracts | 57,225,837 | 350 | 45.35GB | 16 sec | 1 hr 51 min | 39.4 secs |
| 合計 | 8.26 billion | 23,577 | 3.982TB | 8 min 3 sec | > 6 days 5 hrs | 53 mins 45 secs |
テーブルデータを GCS にエクスポートする
この手順では、BigQuery SQL ワークスペース を使用して SQL 文を実行します。ここでは、EXPORT DATA ステートメントを使用して、mytable という BigQuery テーブルを GCS のバケットにエクスポートします。
上記のクエリでは、BigQuery テーブルを Parquet データ形式 にエクスポートしています。また、uri パラメータには * 文字を含めています。これにより、エクスポートするデータが 1GB を超える場合に、出力が複数ファイルに分割され、それぞれに数値の接尾辞が連番で付与されます。
この方法には、いくつかの利点があります。
- Google は、1 日あたり最大 50TB までを無料で GCS にエクスポートできるようにしています。ユーザーは GCS ストレージ分のみを支払うだけで済みます。
- エクスポートは自動的に複数のファイルを生成し、それぞれを最大 1GB のテーブルデータに制限します。これは、インポートを並列化できるため ClickHouse にとって有利です。
- 列指向フォーマットである Parquet は、標準で圧縮されており、BigQuery によるエクスポートおよび ClickHouse によるクエリが高速であるため、より優れたデータ交換形式です。
GCS から ClickHouse へのデータインポート
エクスポートが完了したら、このデータを ClickHouse のテーブルにインポートできます。以下のコマンドを実行するには、ClickHouse SQL console か clickhouse-client を使用できます。
まず ClickHouse でテーブルを作成しておく必要があります。
テーブルを作成したら、クラスタ内に複数の ClickHouse レプリカがある場合は、エクスポート処理を高速化するために parallel_distributed_insert_select 設定を有効にしてください。ClickHouse ノードが 1 つだけの場合は、この手順はスキップして構いません。
最後に、INSERT INTO SELECT コマンド を使用して、GCS から ClickHouse テーブルにデータを挿入します。このコマンドは、SELECT クエリの結果に基づいてテーブルにデータを挿入します。
INSERT するデータを取得するには、s3Cluster 関数 を使用して GCS バケットからデータを読み取ります。GCS は Amazon S3 と相互運用可能なため、これが利用できます。ClickHouse ノードが 1 台だけの場合は、s3Cluster 関数の代わりに s3 テーブル関数 を使用できます。
上記のクエリで使用されている ACCESS_ID と SECRET は、GCS バケットに関連付けられた HMAC キー です。
ifNull を使用する上記のクエリでは、ClickHouse テーブルにデフォルト値付きでデータを挿入するために、some_text カラムに対して ifNull 関数 を使用しています。ClickHouse 側のカラムを Nullable にすることもできますが、パフォーマンスに悪影響を与える可能性があるため推奨されません。
別の方法として、SET input_format_null_as_default=1 を設定すると、対応するカラムにデフォルト値が指定されている場合、欠損値や NULL 値はそれぞれのカラムのデフォルト値で置き換えられます。
データ エクスポートの成功を確認する
データが正しく挿入されたかを確認するには、新しいテーブルに対して SELECT クエリを実行してみてください。
追加の BigQuery テーブルをエクスポートするには、各テーブルごとに上記の手順を繰り返します。
参考資料とサポート
このガイドに加えて、ClickHouse を使って BigQuery を高速化する方法と、インクリメンタルインポートを処理する方法 を解説したブログ記事もあわせてご覧いただくことをおすすめします。
BigQuery から ClickHouse へのデータ転送に問題が発生した場合は、[email protected] までお気軽にお問い合わせください。