dlt を ClickHouse に接続する
dlt は、Python スクリプトに組み込むことで、さまざまな(しばしば扱いづらい)データソースから、よく構造化されたライブデータセットへデータをロードできるオープンソースライブラリです。
ClickHouse と併せて dlt をインストールする
ClickHouse の依存関係付きで dlt ライブラリをインストールするには:
セットアップガイド
dltプロジェクトの初期化
まず、以下のコマンドで新しいdltプロジェクトを初期化します。
このコマンドは、chessをソースとし、ClickHouseをデスティネーションとするパイプラインを初期化します。
上記のコマンドを実行すると、.dlt/secrets.tomlやClickHouse用のrequirementsファイルを含む複数のファイルとディレクトリが生成されます。requirementsファイルに指定された必要な依存関係は、以下のように実行してインストールできます。
またはpip install dlt[clickhouse]を使用することで、dltライブラリとClickHouseをデスティネーションとして使用するために必要な依存関係をインストールできます。
ClickHouseデータベースのセットアップ
ClickHouseにデータをロードするには、ClickHouseデータベースを作成する必要があります。以下は実行すべき手順の概要です。
-
既存のClickHouseデータベースを使用するか、新しいデータベースを作成します。
-
新しいデータベースを作成するには、
clickhouse-clientコマンドラインツールまたは任意のSQLクライアントを使用してClickHouseサーバーに接続します。 -
以下のSQLコマンドを実行して、新しいデータベースとユーザーを作成し、必要な権限を付与します。
認証情報の追加
次に、以下のように.dlt/secrets.tomlファイルにClickHouseの認証情報を設定します。
http_portパラメーターは、ClickHouseサーバーのHTTPインターフェースに接続する際に使用するポート番号を指定します。これは、ネイティブTCPプロトコルに使用されるデフォルトポート9000とは異なります。
外部ステージングを使用していない場合(つまり、パイプラインでstagingパラメーターを設定していない場合)は、http_portを設定する必要があります。これは、組み込みのClickHouseローカルストレージステージングがclickhouse-connectライブラリを使用しており、このライブラリがHTTP経由でClickHouseと通信するためです。
ClickHouseサーバーがhttp_portで指定されたポートでHTTP接続を受け入れるように設定されていることを確認してください。例えば、http_port = 8443と設定した場合、ClickHouseはポート8443でHTTPリクエストをリッスンしている必要があります。外部ステージングを使用している場合は、clickhouse-connectが使用されないため、http_portパラメーターを省略できます。
clickhouse-driverライブラリで使用されるものと同様のデータベース接続文字列を渡すこともできます。上記の認証情報は次のようになります。
書き込みディスポジション
すべての書き込みディスポジション がサポートされています。
dlt ライブラリの書き込みディスポジションは、データを宛先にどのように書き込むかを定義します。書き込みディスポジションには次の 3 種類があります。
Replace: リソースからのデータで宛先のデータを置き換えます。すべてのクラスとオブジェクトを削除し、データをロードする前にスキーマを再作成します。詳しくはこちらを参照してください。
Merge: リソースからのデータを宛先のデータとマージします。merge ディスポジションを使用する場合は、リソースに対して primary_key を指定する必要があります。詳しくはこちらを参照してください。
Append: これはデフォルトのディスポジションです。primary_key フィールドを無視し、宛先にすでに存在するデータに対してデータを追記します。
データロード
データは、データソースに応じて最も効率的な方法で ClickHouse にロードします。
- ローカルファイルの場合、
clickhouse-connectライブラリを使用し、INSERTコマンドでファイルを ClickHouse のテーブルに直接ロードします。 S3、Google Cloud Storage、Azure Blob Storageなどのリモートストレージ上のファイルの場合、ClickHouse の s3、gcs、azureBlobStorage などのテーブル関数を使用してファイルを読み込み、テーブルにデータを挿入します。
データセット
Clickhouse は 1 つのデータベース内で複数のデータセットをサポートしていませんが、dlt はさまざまな理由からデータセットに依存しています。Clickhouse を dlt と連携させるために、Clickhouse データベース内で dlt によって生成されるテーブル名には、設定可能な dataset_table_separator で区切られたデータセット名が接頭辞として付与されます。さらに、データを含まない特別なセンチネルテーブルが作成され、dlt が Clickhouse のデスティネーションに既に存在する仮想データセットを認識できるようにします。
サポートされているファイル形式
clickhouse 宛先には、デフォルトの SQL 宛先とはいくつか異なる点があります。
Clickhouseには実験的なobjectデータ型がありますが、挙動がやや予測しづらいため、dlt clickhouse 宛先では複合データ型はtextカラムにロードされます。この機能が必要な場合は、Slack コミュニティまでご連絡いただければ、追加を検討します。Clickhouseはtimeデータ型をサポートしていません。timeはtextカラムにロードされます。Clickhouseはbinaryデータ型をサポートしていません。その代わり、バイナリデータはtextカラムにロードされます。jsonlからロードする場合、バイナリデータは base64 文字列となり、parquet からロードする場合は、binaryオブジェクトはtextに変換されます。Clickhouseは、既にデータが存在するテーブルに対して、NOT NULL のカラムを追加することを許可します。Clickhouseは、floatまたはdoubleデータ型を使用した場合、特定の条件下で丸め誤差を生じることがあります。丸め誤差が許容できない場合は、必ずdecimalデータ型を使用してください。たとえば、ローダーのファイル形式をjsonlに設定した状態で値 12.7001 をdoubleカラムにロードすると、必ず丸め誤差が発生します。
サポートされているカラムヒント
ClickHouse は、以下のカラムヒントをサポートしています。
primary_key- カラムがプライマリキーの一部であることを示します。複数のカラムにこのヒントを指定して、複合プライマリキーを作成できます。
テーブルエンジン
デフォルトでは、ClickHouse ではテーブルは ReplicatedMergeTree テーブルエンジンを使用して作成されます。ClickHouse アダプターで table_engine_type を使用することで、別のテーブルエンジンを指定できます。
サポートされている値は次のとおりです。
merge_tree-MergeTreeエンジンを使用してテーブルを作成しますreplicated_merge_tree(デフォルト) -ReplicatedMergeTreeエンジンを使用してテーブルを作成します
ステージングサポート
ClickHouse は、ファイルのステージング先として Amazon S3、Google Cloud Storage、Azure Blob Storage をサポートしています。
dlt は Parquet または JSONL ファイルをステージング用のロケーションにアップロードし、ClickHouse のテーブル関数を使用して、ステージングされたファイルから直接データをロードします。
ステージング先の認証情報の設定方法については、ファイルシステムに関するドキュメントを参照してください。
ステージングを有効にしてパイプラインを実行するには、次のようにします。
ステージング領域として Google Cloud Storage を使用する
dlt では、データを ClickHouse にロードする際のステージング領域として Google Cloud Storage (GCS) を使用できます。これは、dlt が内部的に利用している ClickHouse の GCS テーブル関数 によって自動的に処理されます。
ClickHouse の GCS テーブル関数は、Hash-based Message Authentication Code (HMAC) キーを用いた認証のみをサポートします。これを有効にするために、GCS は Amazon S3 API をエミュレートする S3 互換モードを提供しています。ClickHouse はこの機能を利用して、S3 との連携機能を通じて GCS バケットへアクセスできるようにしています。
dlt で HMAC 認証を用いた GCS ステージングを設定するには:
-
Google Cloud ガイド に従って、GCS サービスアカウント用の HMAC キーを作成します。
-
config.tomlの dlt プロジェクトの ClickHouse 宛先設定内で、サービスアカウントのclient_email、project_id、private_keyとあわせて HMAC キーを設定します。
注意: HMAC キー bashgcp_access_key_id と gcp_secret_access_key に加えて、サービスアカウント用の client_email、project_id、private_key を [destination.filesystem.credentials] セクション内で指定する必要があります。これは、GCS ステージングのサポートが現在、一時的なワークアラウンドとして実装されており、まだ最適化されていないためです。
dlt はこれらの認証情報を ClickHouse に渡し、認証および GCS へのアクセスは ClickHouse が処理します。
将来的に、ClickHouse dlt destination 向けの GCS ステージング設定を簡素化し改善するための作業が進行中です。正式な GCS ステージングサポートは、次の GitHub issue でトラッキングされています:
- filesystem destination を S3 互換モードで GCS と連携できるようにする
- Google Cloud Storage ステージングエリアのサポート
dbt サポート
dbt との連携は、一般に dbt-clickhouse を通じてサポートされています。
dlt state の同期
この destination は、dlt state の同期を完全にサポートしています。