ClickHouse/docs/ja/migrations/bigquery/loading-data.md
2024-11-18 11:58:58 +09:00

8.8 KiB
Raw Blame History

sidebar_label title slug description keywords
データのロード BigQuery から ClickHouse へのデータのロード /ja/migrations/bigquery/loading-data BigQuery から ClickHouse へのデータのロード方法
移行
データ
etl
elt
bigquery

このガイドは、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 秒 37 分 15.4 秒
transactions 1,864,514,414 5169 957GB 1 分 38 秒 1 日 8 時間 18 分 5 秒
traces 6,325,819,306 17,985 2.896TB 5 分 46 秒 5 日 19 時間 34 分 55 秒
contracts 57,225,837 350 45.35GB 16 秒 1 時間 51 分 39.4 秒
合計 8.26 billion 23,577 3.982TB 8 分 3 秒 > 6 日 5 時間 53 分 45 秒

1. GCS へのテーブルデータのエクスポート

このステップでは、BigQuery SQL ワークスペース を利用して SQL コマンドを実行します。以下では、EXPORT DATA ステートメントを使用して、mytable という BigQuery テーブルを GCS バケットにエクスポートします。

DECLARE export_path STRING;
DECLARE n INT64;
DECLARE i INT64;
SET i = 0;

-- n を x billion 行に設定することを推奨します。例えば、5 billion 行なら n = 5
SET n = 100;

WHILE i < n DO
  SET export_path = CONCAT('gs://mybucket/mytable/', i,'-*.parquet');
  EXPORT DATA
    OPTIONS (
      uri = export_path,
      format = 'PARQUET',
      overwrite = true
    )
  AS (
    SELECT * FROM mytable WHERE export_id = i
  );
  SET i = i + 1;
END WHILE;

上記のクエリでは、BigQuery テーブルを Parquet データフォーマット にエクスポートしています。また、uri パラメータに * 文字を使用しています。これにより、エクスポートが 1GB を超える場合、出力が複数のファイルに分散され、数値が増加するサフィックスが付与されます。

このアプローチには以下の利点があります:

  • Google は 1 日あたり最大 50TB を無料で GCS にエクスポートできます。ユーザは GCS ストレージの料金のみを支払います。
  • エクスポートは複数のファイルを自動的に生成し、それぞれ最大 1GB のテーブルデータに制限されます。これにより、Import 時に並列化が可能になるので ClickHouse にとって有益です。
  • Parquet は列指向フォーマットのため、圧縮されており、BigQuery がより速くエクスポートし、ClickHouse がより速くクエリ できるため、より良い交換フォーマットになります。

2. GCS から ClickHouse へのデータインポート

エクスポートが完了したら、このデータを ClickHouse テーブルにインポートすることができます。以下のコマンドを実行するには、ClickHouse SQL コンソール または clickhouse-client を使用してください。

最初に、ClickHouse にテーブルを作成する必要があります:

-- BigQuery テーブルに STRUCT 型のカラムが含まれている場合、
-- そのカラムを ClickHouse の Nested 型のカラムにマップする設定を有効にする必要があります。
SET input_format_parquet_import_nested = 1;

CREATE TABLE default.mytable
(
	`timestamp` DateTime64(6),
	`some_text` String
)
ENGINE = MergeTree
ORDER BY (timestamp);

テーブルを作成したら、エクスポートを加速するために、クラスター内に複数の ClickHouse レプリカがある場合は、設定 parallel_distributed_insert_select を有効にします。ClickHouse ードが1つしかない場合は、この手順をスキップできます

SET parallel_distributed_insert_select = 1;

最後に、SELECT クエリの結果に基づいてテーブルにデータを挿入する INSERT INTO SELECT コマンド を使用して、GCS から ClickHouse テーブルにデータを挿入できます。

データを INSERT するためには、s3Cluster 関数 を使用して GCS バケットからデータを取得します。GCS は Amazon S3 と互換性があります。ClickHouse ードが1つしかない場合は、s3Cluster 関数の代わりに s3 テーブル関数 を使うことができます。

INSERT INTO mytable
SELECT
    timestamp,
    ifNull(some_text, '') as some_text
FROM s3Cluster(
    'default',
    'https://storage.googleapis.com/mybucket/mytable/*.parquet.gz',
    '<ACCESS_ID>',
    '<SECRET>'
);

上記のクエリで使用されている ACCESS_IDSECRET は、GCS バケットに関連付けられた HMAC キー です。

:::note NULL 可能なカラムをエクスポートする場合は ifNull を使用 上記のクエリでは、ifNull 関数 を使用して some_text カラムのデフォルト値を指定して ClickHouse テーブルにデータを挿入しています。ClickHouse のカラムを Nullable にすることもできますが、パフォーマンスに悪影響を及ぼす可能性があるため推奨されません。

別の方法として、SET input_format_null_as_default=1 を設定すると、欠落している値や NULL 値がそれぞれのカラムのデフォルト値に置き換えられます(そのデフォルトが指定されている場合)。 :::

3. データエクスポートの成功確認

データが正しく挿入されたかどうかを確認するには、新しいテーブルで SELECT クエリを実行してください:

SELECT * FROM mytable limit 10;

他の BigQuery テーブルをエクスポートするには、上記の手順を追加の各テーブルに対して繰り返してください。

さらに詳しい情報とサポート

このガイドに加えて、ClickHouse を使用して BigQuery を高速化し増分インポートを扱う方法を示すブログ記事もお勧めです。

BigQuery から ClickHouse へのデータ転送に問題がある場合は、support@clickhouse.com までお問い合わせください。