LESSON 30分

ストーリー

田中VPoE
Step 2ではバッチ処理を中心としたDWH設計を学んだ。しかし現代のデータ基盤には、リアルタイムにデータを処理する能力も求められる
あなた
日次バッチでは間に合わないユースケースがあるんですね
田中VPoE
例えば不正検知。クレジットカードの不正利用を翌日のバッチで検知しても意味がない。リアルタイムで検知してブロックする必要がある。あるいはリアルタイムのダッシュボード。経営層が「今この瞬間の売上」を見たい場合、バッチの結果は古い
あなた
ストリーム処理はKafkaやFlink等のツールを使うんですよね
田中VPoE
そうだ。ストリーム処理にはイベント時間と処理時間の違い、ウィンドウ処理、Exactly-onceセマンティクスなど、バッチ処理にはない概念がある。これらを正しく理解しないと、データの整合性に問題が生じる

バッチ処理 vs ストリーム処理

比較

観点バッチ処理ストリーム処理
データの単位ファイル/テーブル(有界データ)イベント/レコード(無界データ)
処理タイミングスケジュール(日次/時間次)到着時即座に
レイテンシ分〜時間ミリ秒〜秒
スループット高い(大量データを効率的に)中程度(イベント単位)
状態管理処理完了後に状態を破棄ステートフル(状態を維持)
障害回復再実行が容易チェックポイントで復元
代表ツールSpark, dbt, AirflowKafka Streams, Flink, Spark Streaming

ストリーム処理の基本概念

イベント時間 vs 処理時間

イベント時間 (Event Time):
  イベントが実際に発生した時刻
  例: ユーザーが 14:00:00 にボタンをクリックした

処理時間 (Processing Time):
  イベントが処理エンジンに到達した時刻
  例: ネットワーク遅延やバッファリングにより 14:00:05 に到着

ウォーターマーク (Watermark):
  「これ以降、この時刻以前のイベントは来ない」という宣言
  遅延イベントの許容範囲を定義する

  時間軸:
  14:00  14:01  14:02  14:03  14:04  14:05
    ↑      ↑      ↑      ↑
    |      |      |      └── ウォーターマーク(3分遅延許容)
    |      |      └── このイベントは許容範囲内
    |      └── このイベントも許容範囲内
    └── 14:00のイベントが14:04に到着 → 遅延イベントとして処理

ウィンドウ処理

ウィンドウ種類説明用途
タンブリングウィンドウ固定長、重複なし1分ごとのイベント集計
スライディングウィンドウ固定長、スライド間隔あり過去5分の移動平均
セッションウィンドウアクティビティに基づく可変長ユーザーセッション分析
グローバルウィンドウ全データを1つのウィンドウカウンター
タンブリングウィンドウ(5分間隔):
  |--window 1--|--window 2--|--window 3--|
  00:00  00:05  00:05  00:10  00:10  00:15

スライディングウィンドウ(5分幅、1分スライド):
  |--window 1--|
     |--window 2--|
        |--window 3--|
  00:00  00:01  00:02  00:03  00:04  00:05

セッションウィンドウ(ギャップ 30分):
  |---session 1---|     |---session 2---|
  イベント  イベント       イベント  イベント
            ← 30分以内 →  ← 30分超 →

主要ストリーム処理フレームワーク

ツール比較

観点Apache Kafka StreamsApache FlinkSpark Structured Streaming
処理モデルストリーム(イベント単位)ストリーム(イベント単位)マイクロバッチ
レイテンシミリ秒ミリ秒秒〜分
状態管理RocksDBRocksDB外部ストレージ
Exactly-once対応対応対応
デプロイアプリケーション組み込みクラスタクラスタ
学習コスト低〜中中〜高中(Sparkの知識があれば)
適用場面Kafka中心のアーキテクチャ大規模ストリーム処理バッチとストリームの統合

マネージドサービス

サービスクラウドベース技術特徴
Amazon Kinesis Data StreamsAWS独自Kafkaに類似、フルマネージド
Amazon MSKAWSApache KafkaマネージドKafka
Google Cloud DataflowGCPApache Beamバッチ/ストリーム統一API
Azure Event HubsAzure独自Kafka互換API
Confluent CloudマルチApache Kafka商用Kafka

配信保証

3つのセマンティクス

セマンティクス説明データロスリスク重複リスク
At-most-onceメッセージは最大1回配信ありなし
At-least-onceメッセージは最低1回配信なしあり
Exactly-onceメッセージは正確に1回配信なしなし
Exactly-once の実現方法:

1. べき等(Idempotent)処理
   同じメッセージを複数回処理しても結果が変わらない設計
   例: UPSERT(INSERT ON CONFLICT UPDATE)

2. トランザクション
   Kafkaのトランザクション機能で、読み取り→処理→書き込みを
   アトミックに実行

3. チェックポイント
   処理状態を定期的に保存し、障害時にチェックポイントから復元

「ストリーム処理で最も重要なのは配信保証だ。データが失われるのは論外だが、重複も厄介だ。売上イベントが2回処理されたら売上が2倍になる。Exactly-onceが理想だが、実装コストが高い場合はAt-least-once + べき等処理で対処する」 — 田中VPoE


まとめ

ポイント内容
ストリーム処理イベント到着時に即座に処理する無界データの処理方式
イベント時間 vs 処理時間ウォーターマークで遅延イベントの許容範囲を管理
ウィンドウ処理タンブリング、スライディング、セッションの3種類
配信保証Exactly-onceが理想、At-least-once + べき等処理が現実的

チェックリスト

  • バッチ処理とストリーム処理の違いを説明できる
  • イベント時間と処理時間の違い、ウォーターマークの役割を理解した
  • 3種類のウィンドウ処理の使い分けを説明できる
  • 3つの配信保証セマンティクスの違いとトレードオフを理解した

次のステップへ

次は「イベント駆動アーキテクチャ」を学びます。ストリーム処理の基盤となるイベント駆動の設計パターンを身につけましょう。


推定読了時間: 30分