ストーリー
田
田中VPoE
Step 2ではバッチ処理を中心としたDWH設計を学んだ。しかし現代のデータ基盤には、リアルタイムにデータを処理する能力も求められる
あなた
日次バッチでは間に合わないユースケースがあるんですね
あ
田
田中VPoE
例えば不正検知。クレジットカードの不正利用を翌日のバッチで検知しても意味がない。リアルタイムで検知してブロックする必要がある。あるいはリアルタイムのダッシュボード。経営層が「今この瞬間の売上」を見たい場合、バッチの結果は古い
あなた
ストリーム処理はKafkaやFlink等のツールを使うんですよね
あ
田
田中VPoE
そうだ。ストリーム処理にはイベント時間と処理時間の違い、ウィンドウ処理、Exactly-onceセマンティクスなど、バッチ処理にはない概念がある。これらを正しく理解しないと、データの整合性に問題が生じる
バッチ処理 vs ストリーム処理
比較
| 観点 | バッチ処理 | ストリーム処理 |
|---|
| データの単位 | ファイル/テーブル(有界データ) | イベント/レコード(無界データ) |
| 処理タイミング | スケジュール(日次/時間次) | 到着時即座に |
| レイテンシ | 分〜時間 | ミリ秒〜秒 |
| スループット | 高い(大量データを効率的に) | 中程度(イベント単位) |
| 状態管理 | 処理完了後に状態を破棄 | ステートフル(状態を維持) |
| 障害回復 | 再実行が容易 | チェックポイントで復元 |
| 代表ツール | Spark, dbt, Airflow | Kafka 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 Streams | Apache Flink | Spark Structured Streaming |
|---|
| 処理モデル | ストリーム(イベント単位) | ストリーム(イベント単位) | マイクロバッチ |
| レイテンシ | ミリ秒 | ミリ秒 | 秒〜分 |
| 状態管理 | RocksDB | RocksDB | 外部ストレージ |
| Exactly-once | 対応 | 対応 | 対応 |
| デプロイ | アプリケーション組み込み | クラスタ | クラスタ |
| 学習コスト | 低〜中 | 中〜高 | 中(Sparkの知識があれば) |
| 適用場面 | Kafka中心のアーキテクチャ | 大規模ストリーム処理 | バッチとストリームの統合 |
マネージドサービス
| サービス | クラウド | ベース技術 | 特徴 |
|---|
| Amazon Kinesis Data Streams | AWS | 独自 | Kafkaに類似、フルマネージド |
| Amazon MSK | AWS | Apache Kafka | マネージドKafka |
| Google Cloud Dataflow | GCP | Apache Beam | バッチ/ストリーム統一API |
| Azure Event Hubs | Azure | 独自 | 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 + べき等処理が現実的 |
チェックリスト
次のステップへ
次は「イベント駆動アーキテクチャ」を学びます。ストリーム処理の基盤となるイベント駆動の設計パターンを身につけましょう。
推定読了時間: 30分