こちらからプライベートプレビューのウェイトリストに登録できます。
前提条件
最初の ClickPipe を作成する
- ClickHouse Cloud サービスの SQL Console にアクセスします。
- 左側のメニューで
Data Sourcesボタンを選択し、「Set up a ClickPipe」をクリックします。
- データソースとして GCP Pub/Sub を選択します。
- ClickPipe 名、GCP Project ID、および Pub/Sub へのアクセス権が付与されたサービスアカウントの サービスアカウント JSON ファイル を指定して、フォームに入力します。Project ID は 6~30 文字で、小文字、数字、ハイフンを使用でき、英字で始まり、ハイフンで終わることはできません。
-
取り込む Pub/Sub トピック を選択します。認証情報の検証が完了すると、GCP プロジェクト内のトピックがドロップダウンに自動的に表示され (アルファベット順にソート) 、選択できるようになります。
- データフォーマット。 トピック を選択すると、ClickPipes は Pub/Sub スキーマレジストリを照会します。トピック にネイティブの Avro または Protobuf スキーマが関連付けられている場合、Data format と Schema は自動検出され、セレクタはその トピック 上の最新スキーマに固定されます。ネイティブスキーマのない トピック では、既定で JSONEachRow が使用されます。
- 開始オフセット。 読み取りを開始する位置を選択します。利用可能なオプションは Latest (新しいメッセージのみ) 、Earliest (保持されている最も古いメッセージ) 、Seek to Timestamp (UTC の日時ピッカー付き) です。
- フィルタ式 (任意) 。 メッセージ属性に対する Pub/Sub の subscription filter です。たとえば
attributes.type = "telemetry"のように指定します。フィルタは payload ではなくメッセージ属性にのみ適用され、パイプの作成後に変更することはできません (変更するにはパイプを再作成する必要があります) 。 - UI には選択した トピック のサンプルメッセージが表示され、Flatten object トグルを使って、ネストされた JSON が宛先側でどのようにフラット化されるかをプレビューできます。
- 次のステップでは、新しい ClickHouse table にデータを取り込むか、既存のものを再利用するかを選択できます。画面の指示に従って、table 名、スキーマ、設定を変更してください。上部のサンプル table で、変更内容をリアルタイムにプレビューできます。
- あるいは、既存の ClickHouse table にデータを取り込むこともできます。その場合、UI ではソースのフィールドを、選択した宛先 table の ClickHouse フィールドにマッピングできます。
- 最後に、内部 ClickPipes ユーザーの権限を設定できます。
Full access: クラスターへのフルアクセス権です。宛先 table で materialized view や Dictionary を使用する場合に役立つことがあります。Only destination table: 宛先 table に対するINSERT権限のみです。
- 「Complete Setup」をクリックすると、システムに ClickPipe が登録され、概要 table に一覧表示されるようになります。
- おめでとうございます! 最初の Pub/Sub ClickPipe の設定が正常に完了しました。今後は継続的に実行され、Pub/Sub トピック から ClickHouse Cloud service にデータがリアルタイムで取り込まれます。
管理対象サブスクリプション
- 管理対象サブスクリプションの名前は
clickpipes-{pipeID}で、パイプの起動時にそのトピック上に作成されます。 - このサブスクリプションには、ack deadline 60 秒、メッセージ保持期間 7 日、メッセージ順序指定 enabled が設定されます。
- サブスクリプションの作成は冪等です。パイプの再起動やレプリカの再スケジュール時には、設定されたトピックを参照する既存のサブスクリプションがあればそれが再利用されます。
- トピック discovery とメッセージ sampling の際には、ClickPipes は短命な ephemeral サブスクリプション (
clickpipes-discovery-{uuid}) も作成し、sampling が完了するとすぐに削除します。 - パイプが削除されると、ClickPipes はクリーンアップの一環として管理対象サブスクリプションを削除します。
対応データフォーマット
圧縮
- gzip
- zstd
- lz4
- snappy (framed format)
JSON のようなテキストベースのフォーマットでは、自動検出は安全です。これは、印字可能な ASCII 文字が圧縮のマジックバイトと衝突することがないためです。解凍後のペイロードは 64MB に制限されます。
サポートされているデータ型
標準型のサポート
- 基本数値型 - [U]Int8/16/32/64、Float32/64、BFloat16
- 大きな整数型 - [U]Int128/256
- Decimal 型
- Boolean
- String
- FixedString
- Date、Date32
- DateTime、DateTime64 (UTC タイムゾーンのみ)
- Enum8/Enum16
- UUID
- IPv4
- IPv6
- すべての ClickHouse LowCardinality 型
- キーと値に上記いずれかの型を使用する Map (Nullable を含む)
- 要素に上記いずれかの型を使用する Tuple および Array (Nullable を含む、深さは 1 レベルのみ)
- SimpleAggregateFunction 型 (AggregatingMergeTree または SummingMergeTree の宛先用)
Variant 型のサポート
Variant(String, Int64, DateTime) など) を手動で指定できます。
ClickPipes では使用する適切な Variant のサブタイプを判定する仕組み上、Variant の定義で使用できる整数型または datetime 型は 1 つだけです。たとえば、Variant(Int64, UInt32) はサポートされていません。
JSON 型のサポート
Pub/Sub 仮想カラム
Add Column ボタンを使用して仮想カラムを追加できます。
| Name | Description | Recommended Data Type |
|---|---|---|
| _message_id | ブローカーによって割り当てられる Pub/Sub メッセージ ID | String |
| _publish_time | Pub/Sub の公開 timestamp (ミリ秒精度、UTC) | DateTime64(3) |
| _ordering_key | Pub/Sub の ordering key (メッセージに key が設定されていない場合は空文字列) | String |
| _attributes | ユーザー定義の Pub/Sub メッセージ attribute | Map(String, String) |
| _raw_message | Pub/Sub メッセージの完全な payload (デフォルトでは無効) | String |
_raw_message フィールドは、Pub/Sub メッセージの完全な payload のみが必要な場合に使用できます (たとえば、ClickHouse の JsonExtract* 関数を使用して下流の materialized view を生成する場合など) 。このようなパイプでは、「仮想」ではないカラムをすべて削除することで、ClickPipes のパフォーマンスが向上する場合があります。
制限事項
- DEFAULT はサポートされていません。
- 最小の (XS) レプリカサイズで実行している場合、個々のメッセージの上限はデフォルトで 8MB (非圧縮) で、より大きいレプリカでは 16MB (非圧縮) です。この上限を超えるメッセージはエラーとなり拒否されます。より大きなメッセージが必要な場合は、サポートまでお問い合わせください。
- Pub/Sub サブスクリプションのフィルタは変更できません。フィルタ式を変更するには、パイプを再作成する必要があります。
- フィルタはメッセージ属性にのみ適用され、メッセージのペイロードには適用されません。
パフォーマンス
バッチ処理
- バッチサイズが上限に達した場合 (100,000 行、またはレプリカのメモリ 1GB あたり 32MB)
- バッチの保持時間が上限に達した場合 (5 秒)
レイテンシ
順序キー
スケーリング
配信セマンティクス
_message_id 仮想カラムを使って下流で重複排除を行ってください (各 Pub/Sub メッセージ ID はトピック内で一意です) 。