リアルタイム分析比較:Apache Flink vs Spark Streaming vs Materialize でストリームを処理する
オープンソースラボ編集部 ・ 2026年6月17日
リアルタイム分析比較:Apache Flink vs Spark Streaming vs Materialize でストリームを処理する
⚡ リアルタイムデータストリームをSQLで分析するエンジン。Apache Flink・Spark Streaming・Materializeの特徴と使い分けを解説します。
ストリーム処理とは
IoT・ユーザー行動・金融取引などのデータをリアルタイムで処理・集計・検知するコンピューティングモデルです。バッチ処理と違い、データの到着と同時に処理が走ります。
主要ツール比較表
| 項目 | Apache Flink | Spark Streaming | Materialize |
|---|---|---|---|
| ライセンス | Apache 2.0 | Apache 2.0 | BSL 1.1 |
| API | Java/Python/SQL | Scala/Python/SQL | PostgreSQL互換SQL |
| 処理モデル | 真のストリーム | マイクロバッチ | インクリメンタルSQL |
| レイテンシー | ミリ秒 | 秒〜分 | ミリ秒 |
| 状態管理 | ◎ | ○ | ◎ |
| 複雑なロジック | ◎ | ◎ | △ |
| SQLフレンドリー | ○(Flink SQL) | ○(Spark SQL) | ◎ |
| Kafka統合 | ◎ | ◎ | ◎ |
| 学習コスト | 高 | 中 | 低(SQL知識のみ) |
各ツールの特徴
Apache Flink
真のストリーム処理エンジン。イベント到着ごとに処理するため、ミリ秒レイテンシーが実現できます。
主な特徴:
- ネイティブストリーム処理(マイクロバッチではない)
- ステートフル計算(ウィンドウ集計・ジョイン等)
- Exactly-Once保証
- Kafkaコネクターが充実
// Flink DataStream API(Java)
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Kafkaソース設定
KafkaSource<String> source = KafkaSource.<String>builder()
.setBootstrapServers("kafka:9092")
.setTopics("orders")
.setGroupId("flink-consumer")
.setStartingOffsets(OffsetsInitializer.latest())
.setValueOnlyDeserializer(new SimpleStringSchema())
.build();
DataStream<String> stream = env.fromSource(source,
WatermarkStrategy.noWatermarks(), "Kafka Source");
// 5分間のウィンドウで注文数を集計
stream
.map(value -> new Tuple2<>("order", 1))
.returns(Types.TUPLE(Types.STRING, Types.INT))
.keyBy(t -> t.f0)
.window(TumblingProcessingTimeWindows.of(Time.minutes(5)))
.sum(1)
.print();
env.execute("Order Count Job");
-- Flink SQL(よりシンプルな書き方)
CREATE TABLE orders (
order_id STRING,
user_id STRING,
amount DECIMAL(10, 2),
event_time TIMESTAMP(3),
WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'orders',
'properties.bootstrap.servers' = 'kafka:9092',
'format' = 'json'
);
-- 1分間隔のウィンドウ集計
SELECT
TUMBLE_START(event_time, INTERVAL '1' MINUTE) AS window_start,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
GROUP BY TUMBLE(event_time, INTERVAL '1' MINUTE);
向いているケース: 超低レイテンシー・複雑なストリーム処理・Exactly-Once
Spark Streaming(Structured Streaming)
Sparkのマイクロバッチ処理モデル。大規模バッチ処理も同じコードで扱え、データエンジニアに親しみやすいAPIです。
主な特徴:
- SparkのエコシステムでストリームもバッチもAPI統一
- Delta Lakeとの統合でストリーム+バッチの統合処理
- MLlib等のSparkライブラリをリアルタイム処理に適用
- Databricksでのマネージドサービス
# PySpark Structured Streaming
from pyspark.sql import SparkSession
from pyspark.sql.functions import window, count, sum as spark_sum
spark = SparkSession.builder .appName("OrderAnalytics") .getOrCreate()
# Kafkaからストリーム読み込み
orders_stream = spark .readStream .format("kafka") .option("kafka.bootstrap.servers", "kafka:9092") .option("subscribe", "orders") .load()
# JSONをパース
from pyspark.sql.types import StructType, StringType, DoubleType, TimestampType
schema = StructType() .add("order_id", StringType()) .add("amount", DoubleType()) .add("event_time", TimestampType())
orders = orders_stream .select(from_json(col("value").cast("string"), schema).alias("data")) .select("data.*")
# 1分ウィンドウ集計
result = orders .withWatermark("event_time", "30 seconds") .groupBy(window("event_time", "1 minute")) .agg(count("*").alias("count"), spark_sum("amount").alias("total"))
# コンソールに出力(デバッグ用)
query = result.writeStream .outputMode("append") .format("console") .start()
query.awaitTermination()
向いているケース: Sparkエコシステム・バッチとストリームの統合
Materialize
PostgreSQL互換SQLでリアルタイムビューを定義するストリーム処理データベース。SQLエンジニアがコードなしでリアルタイム分析を構築できます。
主な特徴:
- PostgreSQL互換SQLでストリームを定義
- Incremental View Maintenance(クエリ結果を常に最新に保つ)
- Kafkaソースを「テーブル」のように扱える
- 既存のBIツール(Metabase・Grafana)から直接接続
-- Materialize: KafkaソースをSQLで定義
CREATE SOURCE orders_source
FROM KAFKA CONNECTION kafka_connection (TOPIC 'orders')
FORMAT JSON;
-- リアルタイムビュー(常に最新状態を保つ)
CREATE MATERIALIZED VIEW order_stats AS
SELECT
date_trunc('minute', event_time) AS minute,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders_source
GROUP BY date_trunc('minute', event_time);
-- ビューをリアルタイムで購読
SUBSCRIBE TO order_stats;
-- Grafanaや既存ツールからも普通のSQLでクエリ可能
SELECT * FROM order_stats WHERE minute > now() - interval '1 hour';
向いているケース: SQLエンジニア・BIツール統合・PostgreSQL互換
選択ガイド
| 状況 | 推奨 |
|---|---|
| ミリ秒レイテンシー・複雑なロジック | Apache Flink |
| Sparkエコシステム・バッチ+ストリーム | Spark Streaming |
| SQL中心・BIツール統合・低学習コスト | Materialize |
内部リンク
外部リソース
FAQ
Q. Flinkとマイクロバッチの違いは何ですか?
マイクロバッチ(Spark)は「小さなバッチを連続実行」するため最小でも数秒のレイテンシーがあります。Flink の真のストリーミングはイベント到着のたびに処理するためミリ秒が実現できます。
Q. Materializeは商用利用できますか?
BSL 1.1ライセンスで、Materializeのサービスを競合SaaSとして提供する場合以外は商用利用可能です。Materialize Cloud(SaaS)も提供されています。
Q. KafkaなしでFlinkを使えますか?
はい。Flink はファイル・JDBC・RabbitMQ・Kinesis等、Kafka以外のソースも豊富に対応しています。
Q. Spark StreamingとFlink、どちらが本番で多く使われていますか?
現在は両方とも多くの本番事例があります。既存SparkユーザーはSpark Streaming、新規構築でリアルタイム性重視ならFlinkを選ぶケースが多いです。