この記事について
Databricks の Structured Streaming、AWS Kinesis、Oracle Streaming Service の3つのストリーミング処理基盤を比較する。
1. サービス概要
| 観点 | Structured Streaming | Kinesis | Oracle Streaming |
|---|---|---|---|
| 種別 | ストリーム処理エンジン | メッセージングサービス | メッセージングサービス |
| 基盤 | Apache Spark | AWS 独自 | Apache Kafka 互換 |
| 処理モデル | マイクロバッチ / Continuous | Consumer が処理 | Consumer が処理 |
| 管理 | Databricks クラスタ | フルマネージド | フルマネージド |
重要な違い:Structured Streaming は「処理エンジン」であり、Kinesis / Oracle Streaming は「メッセージング基盤」である。Structured Streaming は Kinesis や Kafka からデータを読み取って処理する側。
[Producer] → [Kinesis / Kafka / Oracle Streaming] → [Structured Streaming] → [Delta Lake]
メッセージング基盤 処理エンジン 出力先
2. Structured Streaming
2-1. 処理モデル
入力ストリーム(無限のテーブルとして扱う)
│
▼
┌──────────────────────┐
│ マイクロバッチ処理 │
│ (デフォルト: トリガー間隔で小バッチ) │
│ │
│ or Continuous 処理 │
│ (低レイテンシ、ミリ秒) │
└──────────┬───────────┘
▼
出力(Delta Lake, Kafka, コンソール等)
2-2. バッチとストリーミングの統一
Structured Streaming の最大の特徴は、バッチと同じ API でストリーミング処理を書けること。
# バッチ
df = spark.read.format("delta").load("s3://data/orders")
result = df.groupBy("date").agg(sum("amount"))
# ストリーミング(ほぼ同じコード)
df = spark.readStream.format("delta").load("s3://data/orders")
result = df.groupBy("date").agg(sum("amount"))
result.writeStream.format("delta").start("s3://data/daily_sales")2-3. Exactly-Once 保証
| コンポーネント | 保証方法 |
|---|---|
| ソース | オフセット管理(チェックポイント) |
| 処理 | マイクロバッチの原子性 |
| シンク | 冪等な書き込み(Delta Lake の ACID) |
チェックポイントにより、障害時に最後に成功したマイクロバッチから再開できる。
2-4. ウォーターマーク
遅延データの処理を制御する。
df.withWatermark("event_time", "10 minutes") \
.groupBy(window("event_time", "5 minutes")) \
.agg(sum("amount"))
# → 10分以上遅れたデータは破棄3. 3サービス比較
3-1. メッセージング基盤として
| 観点 | Kinesis Data Streams | Oracle Streaming | Kafka(参考) |
|---|---|---|---|
| プロトコル | AWS 独自 API | Kafka 互換 API | Kafka プロトコル |
| パーティション | シャード | パーティション | パーティション |
| スループット | 1MB/s per シャード | Kafka 互換 | 設定依存 |
| 保持期間 | 24h〜365日 | 24h〜7日 | 設定依存 |
| 順序保証 | シャード内 | パーティション内 | パーティション内 |
| マネージド | ✅ | ✅ | ❌(MSK は ✅) |
3-2. ストリーム処理エンジンとして
| 観点 | Structured Streaming | Kinesis Data Analytics | OCI Data Flow |
|---|---|---|---|
| エンジン | Spark | Apache Flink | Spark |
| 処理モデル | マイクロバッチ / Continuous | 真のストリーミング | マイクロバッチ |
| レイテンシ | 秒〜分(マイクロバッチ) | ミリ秒 | 秒〜分 |
| ステート管理 | チェックポイント | Flink State Backend | チェックポイント |
| SQL サポート | ✅ Spark SQL | ✅ Flink SQL | ✅ Spark SQL |
| Delta Lake 統合 | ネイティブ | ❌ | ❌ |
4. ユースケース別の推奨
| ユースケース | 推奨構成 |
|---|---|
| ログ → S3 に配信 | Kinesis Firehose(最もシンプル) |
| リアルタイム集計 → ダッシュボード | Kinesis + Flink(低レイテンシ) |
| ストリーミング ETL → Delta Lake | Kinesis + Structured Streaming |
| バッチ + ストリーミング統合 | Structured Streaming(コード統一) |
| Kafka 既存環境の移行 | Oracle Streaming(Kafka 互換) |
5. Databricks でのストリーミングパイプライン
[IoT / アプリ]
│
▼
[Kinesis Data Streams / Kafka]
│
▼
[Structured Streaming on Databricks]
│ Auto Loader or readStream
▼
[Delta Lake (Bronze)]
│ DLT (Streaming)
▼
[Delta Lake (Silver)]
│ DLT
▼
[Delta Lake (Gold)]
│
▼
[SQL Warehouse / BI]
この構成の利点: – メッセージング → 処理 → ストレージ → 分析が1つのプラットフォーム – バッチとストリーミングが同じ Delta Lake テーブルに書き込み – Unity Catalog で統合ガバナンス
6. まとめ
| 観点 | Structured Streaming | Kinesis | Oracle Streaming |
|---|---|---|---|
| 種別 | 処理エンジン | メッセージング | メッセージング |
| 強み | バッチ統一、Delta Lake 統合 | AWS 統合、Firehose | Kafka 互換 |
| レイテンシ | 秒〜分 | ミリ秒(Streams) | ミリ秒 |
| マルチクラウド | ✅ | ❌ | ❌ |
- Structured Streaming は「処理エンジン」であり、Kinesis / Kafka と組み合わせて使う
- バッチとストリーミングを統一したい場合は Structured Streaming が最適
- 真のミリ秒レイテンシが必要な場合は Flink(Kinesis Data Analytics)を検討
次回からは Databricks のレイクハウスアーキテクチャを深掘りする。
参考文献
- Databricks. “Structured Streaming.” https://docs.databricks.com/en/structured-streaming/
- AWS. “Amazon Kinesis.” https://docs.aws.amazon.com/kinesis/
- Oracle. “OCI Streaming.” https://docs.oracle.com/en-us/iaas/Content/Streaming/
- Tyler Akidau et al. “Streaming Systems.” O’Reilly Media, 2018.