Skip to main content
Pub/Sub to ClickHouse テンプレートは、Pub/Sub サブスクリプションから JSON エンコードされたメッセージを読み取り、ClickHouse テーブルに書き込むストリーミング パイプラインです。 パースに失敗したメッセージ、またはターゲット スキーマにマッピングできなかったメッセージは、デッドレターの宛先 (ClickHouse テーブル、Pub/Sub トピック、またはその両方) にルーティングされます。

パイプラインの要件

  • ソースの Pub/Sub サブスクリプションが存在している必要があります。
  • サブスクリプションにパブリッシュされるメッセージは、有効な JSON である必要があります。
  • ClickHouse のターゲットテーブルが存在している必要があり、そのカラム名は JSON ペイロード内のフィールド名と一致している必要があります。
  • ClickHouse ホストは、Dataflow の worker マシンからアクセス可能である必要があります。
  • 少なくとも 1 つのデッドレター宛先 (clickHouseDeadLetterTable または deadLetterTopic) を指定する必要があります。両方を指定した場合、処理に失敗したメッセージは両方の宛先に同時にルーティングされます。
  • clickHouseDeadLetterTable を設定する場合、デッドレターテーブルは デッドレター処理 に示されているスキーマで、ClickHouse 内にあらかじめ存在している必要があります。
  • deadLetterTopic を設定する場合、Pub/Sub トピックはあらかじめ存在している必要があります。

Template パラメータ



すべての ClickHouseIO パラメータのデフォルト値は、ClickHouseIO Apache Beam Connector を参照してください。

メッセージ形式とスキーマのマッピング

Pub/Sub メッセージは、トップレベルのフィールド名が ClickHouse のターゲットテーブルのカラム名と完全に一致する JSON オブジェクトである必要があります。 受信メッセージをターゲットテーブルにマッピングするため、パイプラインは起動時に次の処理を実行します。
  1. ClickHouse のターゲットテーブルのスキーマを取得します。
  2. その ClickHouse スキーマから Beam の Row スキーマを構築します。
  3. 受信した各 Pub/Sub メッセージについて JSON ペイロードを解析し、ClickHouse スキーマで定義されたフィールドを読み取って行を組み立てます。

JSON フィールド名は、ClickHouse のカラム名と完全に一致している必要があります (大文字と小文字は区別されます) 。メッセージ内のフィールドのうち、ClickHouse のカラムに対応しないものは無視されます。ClickHouse のカラムに対応するフィールドが JSON ペイロード内に存在しない場合、パイプラインはそのカラムに NULL を書き込もうとします。これは、そのカラムが Nullable として宣言されている場合にのみ成功します。解析に失敗したメッセージ、値をカラムの型に変換できないメッセージ、または Nullable でないカラムに NULL を書き込もうとするメッセージは、デッドレター 宛先にルーティングされます。

型変換

JSON 値は、対応する ClickHouse のカラム型に変換されます。

バッチ処理とウィンドウ化

このパイプラインはストリーミングで動作するため、受信した行は ClickHouse に書き出される前にウィンドウに蓄積されます。ウィンドウ化の戦略は、指定したパラメータに応じて選択されます。 これらの値を調整することで、レイテンシと INSERT 効率のバランスを取れます。ウィンドウが小さいほどエンドツーエンドのレイテンシは低くなり、ウィンドウが大きいほど INSERT バッチは少なくなり、1 回あたりのサイズは大きくなります。

デッドレター処理

JSON のパース、スキーマのマッピング、または型変換に失敗したメッセージは、設定されたデッドレターの宛先にルーティングされます。clickHouseDeadLetterTable または deadLetterTopic の少なくともいずれか 1 つを指定する必要があります。両方が設定されている場合、失敗したメッセージはその両方に送信されます。

ClickHouse デッドレターテーブル

clickHouseDeadLetterTable が設定されている場合、デッドレターテーブルは次の固定スキーマですでに作成されている必要があります。 単一ノードデプロイメント向けの最小定義:
デプロイ環境に合わせて、エンジンとORDER BY句を調整してください。レプリケートテーブルにはReplicatedMergeTreeを使用し、分散構成ではON CLUSTERを追加するほか、必要に応じてパーティション化や有効期限 (TTL) も調整してください。

Pub/Sub デッドレタートピック

deadLetterTopic が設定されている場合、失敗した各メッセージは次の内容でそのトピックに再公開されます。
  • ペイロード: 元のメッセージのバイト列。
  • 属性 errorMessage: 失敗時に記録された例外メッセージ。
  • 属性 failedAt: 行の処理が失敗した時点の処理時刻タイムスタンプ。
これにより、原因となっていたスキーマやプロデューサーの問題を解消した後で、失敗したメッセージを簡単に再投入できます。

テンプレートの実行

Pub/Sub to ClickHouse テンプレートは、Google Cloud Console から利用できます。
テンプレートの設定要件と前提条件を十分に理解するため、このドキュメント、特に上記の各セクションを必ず確認してください。
Google Cloud Console にサインインし、Dataflow を検索します。
  1. CREATE JOB FROM TEMPLATE ボタンをクリックします。
  2. テンプレートのフォームが開いたら、ジョブ名を入力し、使用するリージョンを選択します。
  3. Dataflow Template 入力欄に ClickHouse または Pub/Sub と入力し、Pub/Sub to ClickHouse テンプレートを選択します。
  4. 選択すると、フォームが展開されます。以下を入力します。
    • projects/<PROJECT_ID>/subscriptions/<SUBSCRIPTION_NAME> の形式で Pub/Sub の入力サブスクリプション。
    • ClickHouse のエンドポイント URL — ClickHouse Cloud の場合は https://<HOST>:8443 を使用します。
    • ClickHouse のデータベース、ターゲットテーブル、ユーザー名、パスワード。
    • 少なくとも 1 つの デッドレターの宛先: ClickHouse テーブルまたは Pub/Sub トピック (あるいはその両方) 。
  5. 必要に応じて、Template パラメータ セクションで詳しく説明しているとおり、バッチ処理 (windowSecondsbatchRowCount) および ClickHouseIO のチューニングパラメータをカスタマイズします。

ジョブを監視する

ジョブのステータスを監視するには、Google Cloud Console の Dataflow Jobs タブ に移動します。ここでは、進行状況やエラーを含むジョブの詳細を確認できます。 このテンプレートは、PubSubToClickHouse ネームスペース配下に次のカスタムメトリクスも出力します。これらは Dataflow のジョブページで確認できます。

トラブルシューティング

メモリ制限 (合計) 超過エラー (コード 241)

このエラーは、大きなバッチのデータを処理している際に、ClickHouse のメモリが不足すると発生します。この問題を解決するには、次の対応を行ってください。
  • インスタンスのリソースを増やす: データ処理の負荷に対応できるよう、より多くのメモリを備えた大きなインスタンスに ClickHouseサーバーをアップグレードします。
  • バッチサイズを小さくする: Dataflow ジョブの設定で batchRowCount (および/または maxInsertBlockSize) を減らし、ClickHouse に送信するデータの chunk を小さくして、バッチごとのメモリ消費を抑えます。

すべてのメッセージが デッドレター 宛先に送られる

最も一般的な原因は次のとおりです。
  • JSON フィールド名が ClickHouse のカラム名と完全に一致していない (この照合では大文字と小文字が区別されます) 。
  • JSON の値をカラム型に変換できない (たとえば、DateTime カラムに ISO-8601 形式ではない文字列が入っている場合) 。
  • パイプラインの起動後にターゲットテーブルのスキーマが変更された — スキーマは起動時に一度だけ取得されます。スキーマ変更を適用したら、ジョブを再起動してください。
根本原因を特定するには、ClickHouse の デッドレター テーブルの error_message および stack_trace カラム (または Pub/Sub の デッドレター メッセージの errorMessage 属性) を確認してください。

パイプラインは開始するが、ClickHouse に行が届かない

  • サブスクリプションがメッセージを受信していることを確認してください。Dataflow のジョブページで messages-received メトリックを確認します。
  • 時間ベースのモード (windowSeconds のみ) では、行がフラッシュされるのはウィンドウ境界のタイミングだけです。フラッシュが発生していることを確認するため、windowSeconds を小さくしてください。
  • Dataflow ワーカーと ClickHouse エンドポイント間のネットワーク到達性を確認してください (ファイアウォール、VPC ピアリング、または Private Service Connect) 。

Template のソースコード

Template のソースコードは以下で公開されています。
最終更新日 2026年7月23日