「リアルタイムでデータを見たい」と業務側から要望が出ると、データエンジニア側はまずバッチ運用との差を考えます。1日1回の集計で十分なのか、1時間ごとに減らせばいいのか、本当に「リアルタイム」が要るのか。要件と技術選定がずれると、ストリーミング基盤を組んだものの、業務側は結局1時間遅れのダッシュボードしか見ていない、という事態が起きます。

ストリーミング処理は強力ですが、運用負荷も別格です。Kafka・Flink・Materializeを軸に、「いつバッチで足りるか」「いつストリーミングに踏み込むべきか」「どの組み合わせが現実的か」を整理します。

バッチとストリーミングの違い

バッチマイクロバッチストリーミング
遅延数時間〜1日数分〜1時間秒〜サブ秒
処理単位大きな塊小さな塊1イベントごと
運用負荷
典型ツールdbt、Airflowdbt頻度up、SnowpipeKafka+Flink、Materialize
失敗時の再処理容易容易難しい

「遅延」だけで考えるとストリーミングに惹かれますが、運用負荷と再処理の難しさを直視すると、多くの要件はマイクロバッチで足ります。10分遅延のダッシュボードで業務が動くなら、ストリーミングは過剰投資です。dbtでincremental運用する基本はincremental models設計を参照してください。

ストリーミングが本当に必要な場面

  • 不正検知・リスク監視:取引や行動を秒単位で評価し、ブロックや警告を出す
  • パーソナライズドアプリ:ユーザー行動を即座に反映してレコメンドや表示を変える
  • IoT・センサーデータの監視:機器の異常を即時に検知して保全対応
  • 運用ダッシュボード:システムの健全性をリアルタイム監視(DevOps系)
  • ライブイベント:金融市場・スポーツ・選挙のような瞬時性が価値そのものの場面

これらに該当しなければ、まずバッチ・マイクロバッチで運用し、要件が出てから検討するのが現実的です。「将来必要かも」でストリーミング基盤を先に組むのは常に失敗します。

3つのツールの位置づけ

Apache KafkaApache FlinkMaterialize
役割イベントストリームの「土管」分散ストリーム処理エンジンストリーミング対応の関係DB
提供形態OSS+商用(Confluent)OSS+商用(Ververica等)商用SaaS(OSS版は限定的)
主な使い方イベントを集めて配信複雑なストリーム処理SQLでリアルタイムビュー
学習コスト低(SQLが書けるなら)
得意領域大規模イベント配信状態管理が必要な複雑処理シンプルなリアルタイム集計

3者はカテゴリーが違います。Kafkaは「イベントの流通路」、Flinkは「処理エンジン」、Materializeは「ストリーミング対応のSQLデータベース」です。多くの現場で「Kafkaがイベント源、Flink/Materializeが処理」という組み合わせになります。

それぞれの強みと弱み

Apache Kafka

分散イベントストリーミングのデファクトです。LinkedIn発のOSSで、いまや「データ基盤の血管」と呼ばれるほど普及しました。発生したイベント(注文・閲覧・更新等)をまずKafkaに書き、複数の処理側がそれぞれ読む、というアーキテクチャの土台になります。詳細はKafka とはで扱います。

Apache Flink

本格的なストリーム処理エンジンです。「状態」を持つ複雑な処理(時間窓ごとの集計、イベントの相関分析、複雑なジョイン)を高速・低遅延で実行できます。エンジニアリングの難易度は高いものの、本格的なリアルタイム処理ではFlinkが第一選択です。詳細はFlink とはで扱います。

Materialize

SQLで定義したマテリアライズドビューを、ストリームの変更に応じてリアルタイムで更新し続ける、ユニークなデータベースです。「ストリーミング処理をSQLで書く」体験を提供し、Flinkのような専門的なスキルを要しません。詳細はMaterialize とはで扱います。

CDCとの組み合わせ

ストリーミングの最大のユースケースのひとつが、CDC(Change Data Capture)です。データベースの変更(INSERT/UPDATE/DELETE)をリアルタイムにキャプチャし、データ基盤に流す技術で、DebeziumとKafkaの組み合わせが標準パターンです。

構成要素役割
DebeziumDBのbinlog/WALを読み、変更イベント化
Kafka変更イベントの配信ハブ
Flink / Materializeイベントを変換・集計
テーブルフォーマット(Iceberg/Delta/Hudi)処理結果の永続化

CDC・Hudiでの実装はApache Hudi とはでも触れています。「業務DBの変更を、数秒遅れでデータ基盤に届ける」のがCDCストリーミングの典型像です。

選定の判断軸

判断軸選び方
とりあえずイベントを流す土管がほしいKafka(事実上の標準)
複雑な状態管理つきリアルタイム処理が必要Flink
SQLでサクッとリアルタイムビューを作りたいMaterialize
運用負担を最小化したいマネージド(Confluent Cloud、AWS MSK、Materialize Cloud)
本当に必要か迷っているまずdbt incremental+マイクロバッチで試す

マネージドの選択肢

  • Confluent Cloud:Kafka本家のマネージドSaaS
  • AWS MSK:AWSのマネージドKafka
  • Google Cloud Pub/Sub:Kafka互換ではないが、用途は近い
  • Ververica Platform:Flink本家のマネージド
  • Decodable:Flink SQL中心のマネージドストリーム処理
  • Materialize Cloud:Materializeのマネージド

OSSの自社運用は、ストリーミング基盤では重いです。専任SREが1名以上いない組織は、マネージドで始めるのが現実的です。

どこから始めるか

  • ステップ1:本当に「秒単位の遅延」が必要か、業務側と要件を詰める
  • ステップ2:dbt incrementalを高頻度(10〜30分)で動かして、マイクロバッチで足りないかを試す
  • ステップ3:それでも足りない場面(不正検知等)だけ、Kafka+Materializeなど軽量から始める
  • ステップ4:状態管理つきの本格処理が必要になったら、Flinkに踏み込む

「ストリーミング基盤を組んでから使い道を考える」は失敗パターンです。「この業務にこの遅延が必要」を起点に、最小限の構成から段階的に積むのが原則です。

まとめ

  • 「リアルタイム」要望の多くは、マイクロバッチで足りる。ストリーミングは運用負荷が別格。
  • Kafka=イベントの土管、Flink=本格処理エンジン、Materialize=SQLでリアルタイムビュー。
  • CDC(Debezium+Kafka)が典型ユースケース。Hudi等のテーブルフォーマットと組み合わせる。
  • 選定は「土管/本格処理/SQL」の役割と、自社の運用力で決まる。
  • OSS自社運用は重い。マネージド前提で始めるのが現実的。

各ツールの詳細はKafka とはFlink とはMaterialize とはにまとめています。ストリーミング基盤の設計や採否の壁打ちは、DE-STKの初回相談(30分・無料)もご利用ください。

よくある質問(FAQ)

Q. dbt incrementalを5分間隔で回せば、ストリーミングは要らないですか?

A. ユースケースによります。「5分遅れで集計が出ればよい」ダッシュボードなら、それで十分です。ただし、Snowflake等のクラウドDWHは5分間隔の頻繁な実行でクレジット消費が膨らみます。コストと遅延の天秤で、10〜30分間隔のマイクロバッチに落ち着くことが多いです。秒単位の遅延が要件なら、別アーキテクチャ(Kafka+Materialize等)を検討します。

Q. Kafkaは「中規模でも要る」と言われますが本当ですか?

A. データソースが10を超え、複数の下流システム(DWH、検索、通知、ML)に同じイベントを配信する規模なら、Kafkaの価値が出ます。小規模で「業務DBからDWHに1日1回」だけならFivetran/Airbyteで足り、Kafkaは過剰です。Kafkaは「イベントを一度書いて多くの場所が読む」アーキテクチャに移行するときに効きます。データ取り込みの選定はEL vs ETLとデータ取り込みツール選定を参照してください。

Q. FlinkとSpark Streamingはどう違いますか?

A. Flinkは「真のストリーミング」(イベント単位処理)で設計されており、低遅延と複雑な状態管理に強いです。Spark Streamingはマイクロバッチを高速化した方式で、Sparkバッチ運用に近い使い心地です。複雑な低遅延処理がいるならFlink、Sparkでバッチを書き慣れているチームが軽い準リアルタイム処理を始めるならSpark Streaming、と分かれます。

Q. MaterializeとSnowflake Streamsはどう違う?

A. どちらもストリーミング指向ですが、特性が違います。Snowflake StreamsはSnowflake内のテーブルの変更を追跡する仕組みで、増分処理を効率化します。Materializeは独立した「ストリーミング向けに最適化された関係DB」で、外部イベント源からのデータをリアルタイムに集計し続けます。Snowflake内で完結する増分処理はStreams、外部イベントをSQLでリアルタイム集計したいならMaterialize、と覚えてください。Snowflakeの詳細はSnowflakeとはを参照してください。

▼ このトピックをポチポチ学ぶ

ストリーミングとCDC

関連記事を順序立てて読みながら、ステップごとに4択クイズで理解を確認できる学習パスです。登録不要・進捗自動保存。

学習パスを始める →