Google Cloud Storage から ClickHouse Cloud へのデータ取り込みを任意の順序で行い、イベント駆動型の超高速分析を実現できます。ファイル名が辞書順に並んでいる必要はもうありません。
数か月前、私たちは任意の順序でのファイル取り込みへの対応(別名 unordered モード)によって、S3 ClickPipes における最大の使い勝手の課題を解消しました。今回、Cloud Storage 向け Google Cloud Pub/Sub 通知の仕組みを活用し、この機能を Google Cloud Storage (GCS) コネクタにも拡張しました。

これにより、バケットに配置されるファイルの順序を辞書順に揃える心配は不要になります。unordered モードでは、新規ファイルに関する通知をリッスンし、GCS バケットに配置されたファイルから順次取り込みます。バックフィルや再試行、遅延データなど、順序が前後するどのようなケースにも対応できるようになりました。
なぜこれが重要なのか?
デフォルトでは、GCS ClickPipe はファイルが辞書順でバケットに追加されることを前提としており、この暗黙の順序に依存してファイルを順次取り込みます。つまり、新しいファイルは直前に取り込まれたファイルよりも辞書順で必ず大きくなければならず、実環境では常にそうであるとは限りません。例えば、events_2024-12-01.parquet、events_2024-12-02.parquet、events_2024-12-03.parquet という名前のファイルは順番通りに取り込まれますが、後から events_2024-11-30.parquet という名前のバックフィルがバケットに配置された場合、そのファイルは無視されます。
これでは困ります。
非順序モード(unordered mode)を使用すると、この制限はなくなります。バケットを 30 秒ごとにポーリングして次に処理すべきファイルを探す代わりに、ClickPipe は新しいファイルの通知を待ち受けます。通知が届くと、ClickPipes は過去に処理されたファイルとの相対的な順序に関係なく、そのファイルをそのまま処理します。多少の追加設定は必要ですが、数百万個のオブジェクトを扱う環境では、より堅牢でスケーラブルなアプローチとなります。
どのように動作するのか?
暗黙の順序を持たないファイルを取り込むよう GCS ClickPipe を設定するには、バケットから Pub/Sub トピックへの通知を設定する必要があります。これにより、ClickPipes は OBJECT_FINALIZE イベントをリッスンし、ファイルの名前付け規則に関係なく新しいファイルを取り込めるようになります。

非順序モード: ファイルは任意の順序で GCS に配置され (A)、Pub/Sub 通知をトリガーします (B-C)。ClickPipes は指定されたパス内のファイルをポーリングして処理し、メタデータストアを使用して状態を追跡します (1-5)。データは exactly-once 保証付きでターゲットテーブルに挿入されます (6)。
「障害が発生した場合はどうなりますか?」 上記の各ステップは複数のシステムにまたがっており、単一のトランザクション内では行われないため、GCS からの読み取り、処理済みとしてのファイルへのマーク付け、ClickHouse へのデータ挿入など、どのステップでも障害が発生する可能性があります。障害が発生した場合、ClickPipes はバッチを自動的に再処理します。「重複はどうなりますか?」 ファイルが複数回再処理された場合でも、GCS ClickPipe は exactly-once セマンティクスを保証するため、ターゲットテーブルに重複データが入り込むことはありません。
実際の動作を見ていきましょう。
Pub/Sub トピックの作成
以下の手順は、データがすでに保存された GCS バケットがあり、Google Cloud アカウント内で IAM ロールを管理し、新しいリソースを作成する十分な権限があることを前提としています。
1. Google Cloud コンソールで、Pub/Sub > トピック > トピックを作成 に移動します。デフォルトのサブスクリプションを持つ新しいトピックを作成し、トピック名を控えておきます。
2. ClickPipes が指定されたバケット内のオブジェクトの一覧表示と取得を行い、Pub/Sub サブスクリプションからの通知の消費と監視を行えるよう、必要最小限の権限セットを持つサービスアカウントを設定します。

3. バケットに新しいオブジェクトが配置された際に、GCS バケットから Pub/Sub へ通知を送信するよう設定します。このステップは Google Cloud コンソールでは実行できないため、gcloud または任意のプログラミングインターフェースを使用する必要があります。
3.1. gcloud を使用して、OBJECT_FINALIZE イベントタイプの通知をトリガーする通知設定を GCS バケットに追加します:
# Create a Pub/Sub notification for new objects in the bucket
gcloud storage buckets notifications create "gs://${YOUR_BUCKET_NAME}" \
--topic="projects/${YOUR_PROJECT_ID}/topics/${YOUR_TOPIC_NAME}" \
--event-types="OBJECT_FINALIZE" \
--payload-format="json"
# List the Pub/Sub notifications in the bucket
gcloud storage buckets notifications describe失敗した通知のデバッグと再試行を容易にするため、デッドレタートピックも設定することを強くお勧めします。準備はこれだけです。これで、新しいファイルが配置されるたびにバケットからデータを継続的に取り込む ClickPipe を作成できるようになりました。
ClickPipe の作成
1. ClickHouse Cloud コンソールで、Data Sources > Create ClickPipe に移動し、Google Cloud Storage を選択します。GCS バケットに接続するための詳細情報を入力し、認証方法として Service account を指定して .json サービスアカウントキーを提供します。
2. Continuous ingestion をオンに切り替え、新しい Any order 取り込みモードを選択して非順序モードを有効にします。Pub/Sub サブスクリプションへのパスを入力します。

3. Incoming data をクリックします。ターゲットテーブルの Sorting key を定義し(非常に重要)、マッピングされたスキーマに必要な調整を加えます。最後に、ClickPipes データベースユーザーのロールを設定します。

4. あとは待つだけです。 ClickPipes はバケットの初期スキャンを実行した後、新しい通知イベントが到着するたびにファイルの処理を開始します。🚀
コンソールでのクリック作業が多いと感じられる場合でも、ClickPipes は ClickHouse Terraform プロバイダーで完全にサポートされているため、このセットアップをコードとして最初から最後まで構成できます。
次の展開
GCS ClickPipes の新しい非順序モードにより、オブジェクトストレージから ClickHouse Cloud へのより複雑な取り込みパターンの実現が可能になったことを嬉しく思います。完全にマネージドされた超高速な体験はそのままに、さらなる柔軟性を手に入れられます。この機能はデータソースとしての Amazon S3 でも利用可能です。すべてのオブジェクトストレージ向け ClickPipes で機能の同等性を確保するため、近い将来 Azure Blob Storage へのサポート拡大も予定しています。
フィードバックがある場合や、ClickPipes のセットアップ中に問題が発生した場合は、私たちのチームまでお問い合わせください。ステップバイステップの手順、よくある質問、注意点については、GCS ClickPipes のドキュメントをご覧ください。
ETL の複雑さを解消し、データ移動コストを削減する準備はできましたか?今すぐ GCS ClickPipe コネクタを試し、世界最速の分析データベースである ClickHouse Cloud との完全マネージドなネイティブ統合を体験してください。
ETL の複雑さを解消し、データ移動コストを削減しませんか?
今すぐ GCS ClickPipe コネクターを試して、世界最速の分析データベースである ClickHouse Cloud との完全マネージドなネイティブ統合を体験してください。
今すぐ GCS ClickPipe コネクターを試す


