Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kafkaを利用したIcebergへのデータストリーミング

Avatar for Akio SHIMIZU Akio SHIMIZU
September 23, 2025

 Kafkaを利用したIcebergへのデータストリーミング

Apache Iceberg Meetup Japan #3 の登壇資料です。
Kafka ConnectのIceberg Sink Connectorを使用してKafkaのデータをIceBergテーブルにストリームする方法を紹介します。

Avatar for Akio SHIMIZU

Akio SHIMIZU

September 23, 2025
Tweet

More Decks by Akio SHIMIZU

Other Decks in Technology

Transcript

  1. Agenda • 背景・モチベーション • Kafka Connectとは ◦ 概要 ◦ アーキテクチャー

    ◦ SMT Single Message Transform) • Iceberg Sinkコネクター ◦ 概要 ◦ 特徴的な機能 ◦ アーキテクチャー ◦ ファンアウト ◦ SMTの紹介 2
  2. 自己紹介 4 • 清水 亮夫(しみず あきお) • Confluent Japan合同会社 所属

    ◦ システムエンジニアとしてプリセールス活動に従事 ◦ 職歴 ▪ ネットワーク関連ディストリビューター ▪ 国内大手システムインテグレーター ▪ ニュータニックス・ジャパン合同会社 ▪ 現職 ◦ 技術に関連する書籍の共著者、共訳者、監修者
  3. Confluentとは 5 データストリーミングのパイオニア Fortune 500の75%以上 がApache Kafkaを 使用していると推定 150,000以上の組織 がKafkaを使用

    2014年にApache Kafka の初代開発者によって設 立 Jay Kreps Neha Narkhede Jun Rao LinkedIn 在籍中に 開発された テクノロジー 現在アクティブな Kafkaコミッターは 70%以上 2021年に NASDAQ上場
  4. Kafkaを使えば • Kafka Connectの仕組みを使って、様々なデータソースから簡単にデータ パイプラインを構築できる • リアルタイムに近い鮮度の高いデータで分析できる • データパイプラインがシンプル化かつ疎結合されるので、変更や障害に強く なる

    • Flink、Spark、Kafka Streamなどのストリームプロセッシングを利用して、 メッセージをエンリッチできる • 同一のデータをリアルタイム処理やデータ分析など複数用途で利活用でき る • 世界中で利用されている実績のあるプラットフォーム。(正しく設計、構築す れば)堅牢で安定性が高い • 分散型のアーキテクチャーなのでスモールスタートしてデータ流量に合わ せて拡張できる 8
  5. データソースとアプリケーションを完全に分離 データソー ス データソー ス データソー ス データソー ス アプリケーション

    アプリケーション アプリケーション アプリケーション データソー ス データソー ス データソー ス データソー ス アプリケーション アプリケーション アプリケーション アプリケーション 様々なデータを組み合わせて 豊かにし、リアルタイムの データ共有と再利用の拡大を 実現 10 • 複雑性を排除したシンプルかつスケーラブルなアーキテクチャ • 障害の局所化が可能。データを利用するアプリケーションの障害は、データの送信元に影響を与えない • データの利用はプル型の仕組みなのでバックプレッシャーがない • データを活用するアプリケーションの増加や変更が容易。同じTopicを複数のアプリケーションで利用することも可能 • 他チーム、他会社へのデータの共有や、セルフサービスでのデータへのアクセスを実現
  6. Kafkaが並列的かつ高い信頼性でイベントを保持する仕組み 12 Broker 1 Broker 2 Broker 3 Broker 4

    Topic1 partition1 Topic1 partition2 Topic1 partition3 Topic1 partition4 Topic1 partition1 Topic1 partition1 Topic1 partition2 Topic1 partition2 Topic1 partition3 Topic1 partition3 Topic1 partition4 Topic1 partition4 並列的なアクセス データ レプリケーション
  7. Kafka ConnectのConverter ソースやシンク のレコードとオブジェクトをKafkaで 永続化するためのバイナリフォーマット に変換します。 Kafka Connect Kafka Connect

    データ ソース データ シンク Source Connector Sink Connector Converter Converter レコード レコード バイナリ バイナリ JSON, Avro, Protocol Bufferなど
  8. Kafka ConnectのSMTSingle Message Transform) ソースとシンクのレコードオブジェクト の、キーと値、 トピック、パーティションなどの構造を変換 します。 Kafka Connect

    Kafka Connect データ ソース データ シンク Source Connector Sink Connector Converter Converter Transform Transform Transform Transform Transform Transform
  9. SMTの例 19 名称 説明 Drop レコードからキーまたは値を削除し、NULLに設定する Flatten ネストされたデータ構造を平坦化する。これは、各レベルのフィールド名を設定可能な区切り文字で連 結して、各フィールドの名前を生成する InsertField

    レコード・メタデータの属性または設定された静的値を使用してフィールドを挿入する。 MaskField 指定されたフィールドを、フィールド・タイプに対して有効な値でマスクする RegexRouter 構成された正規表現と置換文字列を使用してレコード・トピックを更新する ReplaceField フィールドのフィルタリングや名前を変更する ValueToKey レコードのキーを、レコード値のフィールドのサブセットから形成される新しいキーで置き換える 詳細は以下のURLをご参照。設定例や出力例もありわかりやすいです。 https://docs.confluent.io/kafka-connectors/transforms/current/overview.html Predicatesを設定することで、特定の条件を満たした時のみTransformを実行できます。
  10. Kafka Connect Kafka Connect Kafka Connect データ ソース データ シンク

    Source Connector Sink Connector Converter Converter Transform Transform Transform Transform Transform Transform Connector、Transform、Converterはプラガブル な コンポーネント です。
  11. Kafka Connect クラスター Kafka Connectの構造 (distributed modeの場合) 21 Connect Worker

    1 Conn 1 Conn 1 task 0 Connector Plugin Connector Plugin SMT SMT Connect Worker 2 Connector Plugin Connector Plugin SMT SMT • Connect WorkerはKafka Connectの実行基盤です ◦ VM、コンテナ、K8S Podなど ◦ Connector PluginやSMTはここにインストールします • 複数のKafka Connect Workerにより、Kafka Connectクラスター を構成します ◦ Kafka ConnectクラスターはHAやロードバランスの機能を提供 します • Kafka Connectクラスター上に、Source/Sinkのコネクターインスタ ンスやそのtaskを構成します ◦ コネクターインスタンスには1つ以上のtaskが起動されます ◦ コネクターインスタンス、taskはステートレスです ▪ 管理topicに構成情報やoffsetの情報が記録されます • Status管理 • Offset管理 • Config管理 ◦ 詳細はこちらのドキュメントをご参照 https://docs.confluent.io/platform/current/connect/index.html Conn 1 task 1 Conn 2 task 1 Conn 2 task 0 Conn 2
  12. Dead Letter Queue DLQ • Sinkコネクターでメッセージが処理できない場合の対処方法の一つ ◦ 例えば、KafkaのメッセージはJSONでシリアライズされているのに、SinkコネクターはAvro形式で構成されて いた場合、など •

    不正なメッセージをDLQ topicにルーティングする。コネクター自体は動作を継続する • メッセージのヘッダーに障害となった理由などが書き込まれる • デフォルトの動作は、コネクターのtaskが即時にfailし、コネクターもfailedステータスに遷移する • コネクター側でDQL対応の実装が必要 22 Sink Connector 正常なメッセージ 不正なメッセージ 通常のSInk先 DLQ topic
  13. Confluent Hub: コネクターのリポジトリ 23 https://www.confluent.io/hub/ • Confluentが提供するKafka Connectのリポジトリ ◦ コネクタープラグイン

    ◦ SMT ◦ シリアライゼーションのコンバーター など • Confluent Hubクライアントが提供されており、CLIでインス トールできます (例) confluent-hub install confluentinc/kafka-connect-datagen:latest • OSS、商用など幅広いコネクターが掲載されています • Iceberg Sinkコネクターも含まれています
  14. Iceberg Sinkコネクターの特徴的な機能 26 • 集中型Icebergコミットの調整 • Exactly-onceの配送セマンティクス • 複数のIcebergテーブルへのファンアウト •

    自動テーブル作成 • スキーマ進化への対応 • Icebergの列マッピング機能によるフィールド名のマッピ ング
  15. アーキテクチャ 27 https://github.com/databricks/iceberg-kafka-connect/blob/main/docs/design.md • 全てのタスクがテーブルへのIcebergコミットを実行する と(n*m)個のスナップショットが生成される可能性がある ◦ n: タスク数 ◦

    m: commit intervalの数 • 想定される悪影響 ◦ メタデータの肥大化 ◦ 性能劣化 ◦ 過剰なIcebergカタログイベントの生成 • 上記を回避するため、CoordinatorとWorkerを分離 ◦ Coordinator: カタログに対してIcebergコミットを実 行 ◦ Worker: データファイルの書き込みを実行 • CoordinatorとWorkerの通信チャンネルとして control-topicを使用 ◦ ワーカー間の疎結合性が向上
  16. 処理の流れ 28 コミットタイマー初期化 データの書き込み (継続的な処理) commit time interval (デフォルト5分) Icebergカタログ

    Coordinator Control Topic Worker ファイル コミット開始 イベント 進行中の書き込み を完了 データファイル イベント送信 全データファイル 受信後、Iceberg コミット実施 新しいライターを初 期化し、データの書 き込み コミット時のControl Topicのoffset、UUID、 VTTS(valid-through timestamp)をスナップ ショットのサマリー プロパティに記録 ソースTopic ソースTopicの offsetをコミット
  17. 複数のIcebergテーブルへのファンアウト (静的) • Topicのメッセージを複数のIcebergテーブルに書き込むことができる • 静的なルーティングと動的なルーティングが設定できる • 静的なルーティングの例 29 {

    "name": "events-sink", "config": { "connector.class": "org.apache.iceberg.connect.IcebergSinkConnector", "tasks.max": "2", "topics": "events", "iceberg.tables": "default.events_list,default.events_create", "iceberg.tables.route-field": "type", "iceberg.table.default.events_list.route-regex": "list", "iceberg.table.default.events_create.route-regex": "create", "iceberg.catalog.type": "rest", "iceberg.catalog.uri": "https://localhost", "iceberg.catalog.credential": "<credential>", "iceberg.catalog.warehouse": "<warehouse name>" } } default.events_list default.events_create "type"フィールドの値 list create その他 メッセージはスキップされる
  18. 複数のIcebergテーブルへのファンアウト (動的) • Topicのメッセージを複数のIcebergテーブルに書き込むことができる • 静的なルーティングと動的なルーティングが設定できる • 動的なルーティングの例 30 {

    "name": "events-sink", "config": { "connector.class": "org.apache.iceberg.connect.IcebergSinkConnector", "tasks.max": "2", "topics": "events", "iceberg.tables.dynamic-enabled": "true", "iceberg.tables.route-field": "db_table", "iceberg.catalog.type": "rest", "iceberg.catalog.uri": "https://localhost", "iceberg.catalog.credential": "<credential>", "iceberg.catalog.warehouse": "<warehouse name>" } } default.events_list default.events_create "db_table"フィールドの値 list create その他 メッセージはスキップされる
  19. Iceberg Sinkコネクターに同梱されるSMT 31 Iceberg Sinkコネクターには以下のSMTが同梱されています。 名称 説明 CopyValue あるフィールドから別のフィールドへ値をコピーする DmsTransform

    AWS DMS形式のメッセージを構造を変更し、いくつかのメタデータフィールドを追加する DebeziumTransform Debezium形式のメッセージを構造を変更し、いくつかのメタデータフィールドを追加する JsonToMapTransform 文字列をJSONオブジェクトペイロードとして解析し、スキーマを推測する。 ネストされたオブジェクトをマップに変換し、スキーマにそのマップ型を含める KafkaMetadataTransform topic, partition, offset, timestampなどのメタデータをメッセージに追加する MongoDebeziumTransform Mongo Debezium形式のbefore/after BSON文字列を、DebeziumTransform SMTが期待す るbefore/after 型の構造体(Struct)に変換する
  20. docker composeのお手軽お試し環境 32 https://github.com/confluentinc/cp-all-in-one/ • All in one環境 ◦ 30日間試用できる商用版

    (ウェブコンソールあり) ◦ ずっと使えるコミュニティ版 ◦ etc • サンプルデータを出力する Datagen Sourceコネクターが同梱 • Iceberg Sinkを含む、コネクターをイ ンストールして検証できる command: - bash - -c - | echo "Installing Connector" confluent-hub install --no-prompt iceberg/iceberg-kafka-connect:latest # echo "Launching Kafka Connect worker" /etc/confluent/docker/run & # sleep infinity
  21. 小ネタ • Tabular版の時にサポートされていたUpsertの機能は、Iceberg版ではサ ポートされない ◦ Tabularのドキュメントの"Featureˮの以下の一節が削除されている ▪ Row mutations (update/delete

    rows), upsert mode ◦ 関連issue ▪ #10842 Kafka Connect: Add delta writer support ▪ #13986 Kafka connectors with upsert option • ドキュメントはTabular版の方が充実している ◦ 特にアーキテクチャデザインのドキュメントはこちらにしかない ◦ 関連issue ▪ #13078 Migrate Iceberg Sink design document from databricks repository 33