AI

リアルタイム分析比較: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 FlinkSpark StreamingMaterialize
ライセンスApache 2.0Apache 2.0BSL 1.1
APIJava/Python/SQLScala/Python/SQLPostgreSQL互換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を選ぶケースが多いです。

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。