- Published on
データエンジニアリング完全ガイド2025:Flink vs Spark、dbt、Iceberg、Airflow — モダンデータスタック総整理
- Authors

- Name
- Youngju Kim
- @fjvbn20031
- はじめに
- 1. 2025年データエンジニアリングの地形図(ちけいず)
- 2. ストリーム処理(しょり):Flink vs Spark vs Beam
- 3. オーケストレーション:Airflow 3.0 vs Dagster vs Prefect vs Mage
- 4. dbt:SQLのルネサンス
- 5. レイクハウス:Iceberg vs Delta Lake vs Hudi
- 6. リアルタイム分析(ぶんせき):ClickHouse vs Druid vs Pinot vs StarRocks
- 7. Data MeshとData Contracts
- 8. 実践アーキテクチャ:リアルタイムレコメンデーションシステム
- 9. 資格(しかく)と学習ロードマップ
- 10. ポートフォリオプロジェクト3選
- クイズ
- 参考資料(さんこうしりょう)
はじめに
2025年、データエンジニアはソフトウェア業界で最も需要の高い職種の一つとなりました。AI/MLパイプライン構築の需要が爆発的に増加し、単純なETL開発者からデータプラットフォームアーキテクトへと役割が拡大しています。LinkedInの2025年ジョブレポートによると、データエンジニアの需要は前年比35%増加し、特にストリーミング処理とレイクハウスの経験を持つエンジニアの年俸プレミアムが顕著です。
この記事では、**モダンデータスタック(Modern Data Stack)**のコアコンポーネントを網羅的に解説します。Flink vs Sparkストリーム処理比較から、dbtのSQL革命、Icebergレイクハウス戦争、ClickHouseリアルタイム分析、Airflow 3.0オーケストレーションまで — 実践アーキテクチャと共に2025年データエンジニアリングのすべてを整理します。
1. 2025年データエンジニアリングの地形図(ちけいず)
1.1 データエンジニアが最もホットな理由
2025年にデータエンジニアが注目される3つの理由があります。
第一に、AI/MLパイプライン需要の爆発。 ChatGPT以降、すべての企業がAIを導入しようとしていますが、モデル訓練に必要な高品質データパイプラインを構築できる人材が絶対的に不足しています。Gartnerの推定によると、MLプロジェクトの85%がデータ品質の問題で失敗しています。
第二に、リアルタイム処理要件の急増。 バッチ処理だけでは不十分です。不正検知、リアルタイムレコメンデーション、ダイナミックプライシングなど、ミリ秒単位の意思決定が必要なユースケースが爆発的に増加しています。
第三に、規制とデータガバナンス。 GDPR、AI Actなどデータ規制が強化される中、データリネージ(lineage)と品質管理を専門的に扱えるエンジニアの価値が高まっています。
1.2 モダンデータスタックの進化(しんか)
モダンデータスタックは以下のようなレイヤー構造に進化しました。
[データソース] → [取込/CDC] → [ストリーム処理] → [ストレージ/レイクハウス] → [変換] → [分析/サービング]
| | | | | |
DB, API, Airbyte, Flink, Iceberg/Delta, dbt, ClickHouse,
IoT, SaaS Debezium, Spark S3/GCS/ADLS Spark SQL Pinot, Druid
Fivetran Streaming StarRocks
2020年 vs 2025年の主な変化:
| 領域 | 2020年 | 2025年 |
|---|---|---|
| ストレージ | Data Lake(生データ) | Lakehouse(ACID) |
| 処理 | バッチ中心 | ストリームファースト |
| 変換 | ストアドプロシージャ | dbt + SQL |
| オーケストレーション | Airflow 1.x | Airflow 3.0 / Dagster |
| フォーマット | Parquet/ORC | Iceberg/Delta/Hudi |
| カタログ | Hive Metastore | Unity Catalog / Polaris |
| 品質 | 手動検証 | Great Expectations / Soda |
1.3 技術スタック選択フレームワーク
データスタック選択時に考慮すべき主要基準:
評価基準チェックリスト:
1. レイテンシ要件(バッチ vs ニアリアルタイム vs リアルタイム)
2. データ量(GB/日 vs TB/日 vs PB/日)
3. チーム規模と能力(SQL中心 vs コード中心)
4. ベンダーロックイン許容範囲
5. 予算(オープンソース vs マネージドサービス)
6. 規制要件(データガバナンス、リネージ)
2. ストリーム処理(しょり):Flink vs Spark vs Beam
2.1 ストリーム処理が重要な理由
従来のバッチ処理はデータを集めて一括処理します。しかし、現代のビジネスは即座のインサイトを要求します。不正検知は取引発生直後に判断する必要があり、レコメンデーションシステムはユーザーの行動にリアルタイムで反応する必要があります。
ストリーム処理の核心概念:
[イベントストリーム] ──→ [ウィンドウ] ──→ [集約/変換] ──→ [シンク]
|
┌───────┼───────┐
│ │ │
Tumbling Sliding Session
Window Window Window
(固定) (スライド)(セッション)
2.2 Apache Flink:真のイベント単位処理
Flinkはイベント単位(event-by-event)処理をデフォルトとするストリーム処理エンジンです。バッチはストリームの特殊なケース(bounded stream)として扱います。
主要な強み:
- サブ秒レイテンシ:イベント発生後ミリ秒以内に処理
- チェックポイントベースの状態管理:exactly-once保証
- イベント時間処理:ウォーターマークによる正確な時間ベース処理
- セーブポイント:アプリケーションアップグレード時の状態保存
// Flink - リアルタイム不正検知の例
DataStream<Transaction> transactions = env
.addSource(new FlinkKafkaConsumer<>("transactions", schema, props));
DataStream<Alert> alerts = transactions
.keyBy(Transaction::getAccountId)
.window(SlidingEventTimeWindows.of(Time.minutes(10), Time.minutes(1)))
.aggregate(new FraudScoreAggregator())
.filter(score -> score.getValue() > THRESHOLD);
alerts.addSink(new AlertSink());
Flink SQL — ストリームをテーブルのように:
-- Flink SQL: リアルタイム売上集計
CREATE TABLE orders (
order_id STRING,
amount DECIMAL(10,2),
order_time TIMESTAMP(3),
WATERMARK FOR order_time AS order_time - INTERVAL '5' SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'orders',
'format' = 'json'
);
SELECT
TUMBLE_START(order_time, INTERVAL '1' MINUTE) AS window_start,
COUNT(*) AS order_count,
SUM(amount) AS total_revenue
FROM orders
GROUP BY TUMBLE(order_time, INTERVAL '1' MINUTE);
2.3 Apache Spark Structured Streaming:バッチ+ストリームハイブリッド
Sparkは**マイクロバッチ(micro-batching)**方式でストリームを処理します。バッチ処理の強みを維持しながらストリーミングをサポートします。
主要な強み:
- 統一API:バッチとストリーミングに同一のDataFrame APIを使用
- 豊富なエコシステム:MLlib、GraphX、SparkSQLとのシームレスな統合
- 成熟したコミュニティ:最大のユーザーベースとドキュメント
- Photonエンジン:DatabricksのC++ネイティブエンジンで最大12倍の性能向上
# Spark Structured Streaming - リアルタイム注文分析
from pyspark.sql import SparkSession
from pyspark.sql.functions import window, sum, count
spark = SparkSession.builder.appName("OrderAnalytics").getOrCreate()
orders = spark.readStream \
.format("kafka") \
.option("subscribe", "orders") \
.load()
order_stats = orders \
.withWatermark("order_time", "5 minutes") \
.groupBy(window("order_time", "1 minute")) \
.agg(
count("*").alias("order_count"),
sum("amount").alias("total_revenue")
)
order_stats.writeStream \
.format("iceberg") \
.outputMode("append") \
.option("checkpointLocation", "/checkpoint/orders") \
.toTable("catalog.db.order_stats")
2.4 Apache Beam:統一抽象化(ちゅうしょうか)レイヤー
Beamはパイプライン定義と実行エンジンを分離する抽象化レイヤーです。一度書けばFlink、Spark、Dataflowなど様々なランナーで実行できます。
# Apache Beam - マルチランナーパイプライン
import apache_beam as beam
with beam.Pipeline(options=pipeline_options) as p:
(p
| 'ReadKafka' >> beam.io.ReadFromKafka(
consumer_config=kafka_config,
topics=['orders'])
| 'ParseJSON' >> beam.Map(parse_order)
| 'WindowInto' >> beam.WindowInto(
beam.window.FixedWindows(60)) # 1分ウィンドウ
| 'CountPerWindow' >> beam.combiners.Count.Globally()
| 'WriteToGCS' >> beam.io.WriteToText('gs://bucket/output'))
2.5 Flink vs Spark vs Beam 総合比較(そうごうひかく)
| 特性 | Apache Flink | Spark Structured Streaming | Apache Beam |
|---|---|---|---|
| 処理モデル | 真のイベント単位 | マイクロバッチ | 統一API(ランナー依存) |
| レイテンシ | ミリ秒〜サブ秒 | 秒単位(100ms〜) | ランナー依存 |
| 状態管理 | 内蔵チェックポイント、RocksDB | 制限的(ウォーターマーク) | ランナー依存 |
| 精度 | Exactly-onceがデフォルト | Exactly-once可能 | ランナー依存 |
| SQL対応 | Flink SQL(強力) | Spark SQL(最高) | Beam SQL(制限的) |
| バッチ処理 | 良好(bounded stream) | 最高(ネイティブ) | 良好 |
| ML統合 | 制限的 | MLlib / Spark ML | TFX統合 |
| 学習曲線 | 急峻 | 中程度 | 急峻 |
| 主要ユースケース | リアルタイムCEP、不正検知 | バッチ+ストリームハイブリッド | マルチエンジン移植性 |
| 代表的ユーザー | Alibaba、Uber、Netflix | Databricks顧客全体 | Google Cloud顧客 |
選択ガイド:
- ミリ秒レイテンシが必須 → Flink
- バッチとストリーミング両方が重要 → Spark
- マルチクラウド移植性 → Beam
- GCP中心 → Beam + Dataflow
- Databricks使用中 → Spark
2.6 ベンチマーク:実際の性能比較
Nexocodeの2024ベンチマーク結果(100万イベント/秒処理):
処理レイテンシ(p99):
┌────────────────────────────────────────────┐
│ Flink ████ 23ms │
│ Spark ████████████████ 450ms │
│ Beam/Flink████ 25ms │
│ Beam/Spark████████████████ 460ms │
└────────────────────────────────────────────┘
スループット(イベント/秒):
┌────────────────────────────────────────────┐
│ Flink ████████████████████ 5.2M │
│ Spark ████████████████ 3.8M │
│ Beam/Flink██████████████████ 4.8M │
└────────────────────────────────────────────┘
3. オーケストレーション:Airflow 3.0 vs Dagster vs Prefect vs Mage
3.1 オーケストレーションとは
データパイプラインオーケストレーションは、タスクの順序、依存関係、スケジューリング、リトライ、モニタリングを管理することです。モダンデータスタックにおいて、オーケストレーターはすべてのコンポーネントを接続する「接着剤」の役割を果たします。
3.2 Apache Airflow 3.0:王座の進化(しんか)
Airflowは10年以上にわたりデータオーケストレーションのデファクトスタンダードでした。2025年のAirflow 3.0は大幅な革新をもたらしました。
Airflow 3.0の主要変更点:
Airflow 3.0 コアアップグレード:
1. Reactベースのモダン UI
- リアルタイムログストリーミング
- DAG可視化の改善
- ダークモード対応
2. イベント駆動スケジューリング
- Dataset-awareスケジューリング(データ到着時に自動トリガー)
- 外部トリガーの強化
3. TaskFlow API 2.0
- デコレータベースのPythonネイティブDAG記述
- 動的タスクマッピングの改善
4. Edge Labels & DAGバージョニング
- DAG変更履歴の追跡
- A/BテストDAGのサポート
5. セキュリティ強化
- RBAC改善
- Secret Backend統合の拡張
# Airflow 3.0 - TaskFlow APIの例
from airflow.decorators import dag, task
from datetime import datetime
@dag(schedule="@daily", start_date=datetime(2025, 1, 1), catchup=False)
def data_pipeline():
@task()
def extract():
"""S3から元データを抽出"""
import boto3
# データ抽出ロジック
return {"records": 15000, "source": "s3://datalake/raw/"}
@task()
def transform(data: dict):
"""dbtによるデータ変換"""
import subprocess
subprocess.run(["dbt", "run", "--select", "staging+"])
return {"transformed": data["records"], "models": 12}
@task()
def load(data: dict):
"""ClickHouseに結果をロード"""
# ClickHouseロードロジック
return {"loaded": data["transformed"]}
@task()
def notify(result: dict):
"""Slack通知を送信"""
# Slack通知ロジック
pass
raw = extract()
transformed = transform(raw)
loaded = load(transformed)
notify(loaded)
data_pipeline()
3.3 Dagster:アセット中心のパラダイム
Dagsterは「Software-Defined Assets」の概念を中心に設計されています。タスク(task)ではなく**アセット(asset)**を中心にパイプラインを定義します。
主要な差別化ポイント:
- アセットグラフ:データアセット間の依存関係を明示的に管理
- dbtネイティブ統合:dbtプロジェクトをDagsterアセットに自動変換
- 型システム:I/Oマネージャーによる強力な型検証
- 可観測性:アセットの具体化(materialization)履歴を自動追跡
# Dagster - Software-Defined Assetsの例
from dagster import asset, AssetExecutionContext
from dagster_dbt import DbtCliResource, dbt_assets
@asset(
description="S3から元の注文データを抽出",
group_name="raw",
compute_kind="python"
)
def raw_orders(context: AssetExecutionContext):
"""S3から注文データを抽出"""
import pandas as pd
df = pd.read_parquet("s3://datalake/raw/orders/")
context.log.info(f"Extracted {len(df)} orders")
return df
@asset(
description="注文データの品質検証",
group_name="validated",
compute_kind="great_expectations"
)
def validated_orders(raw_orders):
"""Great Expectationsでデータ品質を検証"""
# 品質検証ロジック
assert raw_orders["amount"].min() >= 0, "マイナス金額を検出"
return raw_orders
# dbtアセットの自動統合
@dbt_assets(manifest=dbt_manifest_path)
def dbt_models(context: AssetExecutionContext, dbt: DbtCliResource):
yield from dbt.cli(["build"], context=context).stream()
3.4 Prefect:最もシンプルなオーケストレーター
Prefectは最小限のボイラープレートと最高の障害処理を目指しています。
# Prefect - 簡潔なパイプライン
from prefect import flow, task
from prefect.tasks import task_input_hash
from datetime import timedelta
@task(retries=3, retry_delay_seconds=60,
cache_key_fn=task_input_hash,
cache_expiration=timedelta(hours=1))
def extract_data(source: str) -> dict:
"""自動リトライとキャッシュ付き抽出"""
# データ抽出
return {"data": [...], "count": 15000}
@task(log_prints=True)
def transform_data(raw: dict) -> dict:
"""変換ロジック"""
print(f"Processing {raw['count']} records")
return {"transformed": raw["count"]}
@flow(name="daily-etl", log_prints=True)
def daily_pipeline():
raw = extract_data("s3://datalake/raw/")
result = transform_data(raw)
print(f"Pipeline complete: {result}")
# 実行
daily_pipeline()
3.5 Mage AI:オールインワンプラットフォーム
Mageはデータエンジニアリングの**統合開発環境(IDE)**を目指しています。ノートブックスタイルのUIでパイプラインを視覚的に構築できます。
3.6 オーケストレーター総合比較
| 特性 | Airflow 3.0 | Dagster | Prefect | Mage |
|---|---|---|---|---|
| パラダイム | DAG/タスク中心 | アセット中心 | フロー/タスク | ノートブック+パイプライン |
| 学習曲線 | 中〜高 | 中 | 低 | 低 |
| dbt統合 | Provider経由 | ネイティブ(最高) | 基本サポート | 基本サポート |
| UI | React(大幅改善) | Dagit(優秀) | Cloud UI | ノートブックスタイル |
| スケーリング | KubernetesExecutor | K8s / ECS | Kubernetes | Kubernetes |
| コミュニティ | 最大(10年以上) | 急成長中 | 中程度 | 成長中 |
| Providerエコシステム | 1000以上 | 100以上 | 200以上 | 50以上 |
| 障害処理 | 中程度 | 良好 | 最高 | 良好 |
| 価格(Cloud) | MWAA費用 | Dagster+ | Prefect Cloud | Mage Pro |
| 推奨シナリオ | 大規模/複雑なパイプライン | dbt中心プロジェクト | 迅速な立ち上げ、簡潔さ | 探索的作業 |
最終推奨:
- エンタープライズ、複雑なパイプライン → Airflow 3.0
- dbt中心、アナリティクスエンジニアリング → Dagster
- 素早く開始、簡潔さ優先 → Prefect
- データサイエンス+エンジニアリング → Mage
4. dbt:SQLのルネサンス
4.1 dbtがデータ変換のパラダイムを変えた
dbt(data build tool)はELTの「T(Transform)」を担当するツールです。SQLだけでデータ変換パイプラインを構築でき、ソフトウェアエンジニアリングのベストプラクティス(バージョン管理、テスト、ドキュメント化)をデータ変換に適用します。
dbtの成長:
dbtのマイルストーン:
- 2016年: Fishtown Analytics設立
- 2020年: dbt Cloud発売
- 2022年: dbt Labsにリブランディング、Series D $222M
- 2023年: MetricFlowオープンソース化
- 2024年: dbt CloudのSemantic Layer GA
- 2025年: ARR $100M以上突破、デファクトスタンダードの地位確立
4.2 dbt Core vs dbt Cloud
| 機能 | dbt Core(OSS) | dbt Cloud |
|---|---|---|
| 価格 | 無料 | Teamプラン月額100ドル〜、Enterprise カスタム |
| 実行環境 | CLI(ローカル/CI) | マネージド実行環境 |
| スケジューリング | 外部(Airflowなど) | 内蔵スケジューラー |
| IDE | VS Code + 拡張機能 | Cloud IDE(ブラウザ) |
| Semantic Layer | MetricFlow CLI | マネージドAPI |
| ドキュメントサイト | 自前ホスティング | 自動生成/ホスティング |
| CI/CD | 自前構成 | Slim CI内蔵 |
4.3 実践dbtプロジェクト構造(こうぞう)
dbt_project/
├── dbt_project.yml
├── packages.yml
├── profiles.yml
├── models/
│ ├── staging/ # ソースデータの整理
│ │ ├── stg_orders.sql
│ │ ├── stg_customers.sql
│ │ └── _staging.yml # テスト&ドキュメント
│ ├── intermediate/ # ビジネスロジックの組合せ
│ │ ├── int_order_items.sql
│ │ └── _intermediate.yml
│ ├── marts/ # 最終分析用テーブル
│ │ ├── finance/
│ │ │ ├── fct_revenue.sql
│ │ │ └── dim_customers.sql
│ │ └── marketing/
│ │ └── fct_campaigns.sql
│ └── metrics/ # MetricFlowメトリクス
│ └── revenue.yml
├── tests/ # カスタムテスト
│ └── assert_positive_revenue.sql
├── macros/ # 再利用可能なSQLマクロ
│ └── cents_to_dollars.sql
├── seeds/ # 静的データ(CSV)
│ └── country_codes.csv
└── snapshots/ # SCD Type 2スナップショット
└── snap_customers.sql
主要モデルの例:
-- models/staging/stg_orders.sql
WITH source AS (
SELECT * FROM {{ source('raw', 'orders') }}
),
renamed AS (
SELECT
id AS order_id,
user_id AS customer_id,
status AS order_status,
amount_cents / 100.0 AS amount_dollars,
created_at AS ordered_at
FROM source
WHERE status != 'cancelled'
)
SELECT * FROM renamed
-- models/marts/finance/fct_revenue.sql
WITH orders AS (
SELECT * FROM {{ ref('stg_orders') }}
),
customers AS (
SELECT * FROM {{ ref('dim_customers') }}
),
final AS (
SELECT
o.order_id,
o.customer_id,
c.customer_segment,
o.amount_dollars,
o.ordered_at,
DATE_TRUNC('month', o.ordered_at) AS order_month
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE o.order_status = 'completed'
)
SELECT * FROM final
# models/staging/_staging.yml
version: 2
models:
- name: stg_orders
description: '整理された注文データ'
columns:
- name: order_id
description: '注文の一意識別子'
tests:
- unique
- not_null
- name: amount_dollars
description: '注文金額(ドル)'
tests:
- not_null
- dbt_utils.accepted_range:
min_value: 0
max_value: 100000
4.4 MetricFlowとSemantic Layer
MetricFlowはdbt Labsがオープンソースとして公開したメトリクス定義フレームワークです。ビジネスメトリクスを一箇所で定義すれば、様々なBIツールで一貫した結果を得られます。
# models/metrics/revenue.yml
semantic_models:
- name: orders
defaults:
agg_time_dimension: ordered_at
model: ref('fct_revenue')
entities:
- name: order_id
type: primary
- name: customer_id
type: foreign
measures:
- name: revenue
agg: sum
expr: amount_dollars
- name: order_count
agg: count
expr: order_id
dimensions:
- name: ordered_at
type: time
- name: customer_segment
type: categorical
metrics:
- name: monthly_revenue
type: simple
type_params:
measure: revenue
- name: revenue_per_customer
type: derived
type_params:
expr: monthly_revenue / active_customers
metrics:
- name: monthly_revenue
- name: active_customers
4.5 dbtベストプラクティス
dbtプロジェクトベストプラクティス10選:
1. レイヤー構造の厳守:staging → intermediate → marts
2. stagingですべてのリネーム・型キャストを完了
3. すべてのモデルにunique + not_nullテストを適用
4. source freshnessチェックでデータ鮮度を監視
5. 増分モデル(incremental)で大容量テーブルを最適化
6. packages.ymlでdbt-utils、dbt-expectationsを活用
7. pre-commitフックでSQLリンティング(sqlfluff)
8. CIでslim CI(state:modified+)を活用
9. 環境別プロファイル分離(dev / staging / prod)
10. Semantic Layerでメトリクスを中央管理
5. レイクハウス:Iceberg vs Delta Lake vs Hudi
5.1 レイクハウスが必要な理由
従来、データレイクとデータウェアハウスは別々のシステムでした。データレイクはあらゆる形式のデータを低コストで保存しますがACIDトランザクションがなく、データウェアハウスは高速な分析クエリを提供しますがコストが高かったです。
レイクハウスはこの二つを結合します:
レイクハウス = データレイクの低コストストレージ + ウェアハウスのACID/性能
従来のアーキテクチャ:
[ソース] → [Data Lake (S3)] → [ETL] → [Data Warehouse (Redshift)]
高コスト、重複ストレージ
レイクハウスアーキテクチャ:
[ソース] → [オブジェクトストレージ (S3)] + [テーブルフォーマット (Iceberg)]
低コスト ACID、スキーマ進化、タイムトラベル
└──→ [分析エンジン (Spark/Trino/Flink)] 直接クエリ
5.2 Apache Iceberg:エンジン非依存の王者(おうじゃ)
IcebergはNetflixが開発したオープンテーブルフォーマットです。特定のエンジンに依存せず、Spark、Flink、Trino、Presto、Hiveなど様々なエンジンから同一テーブルにアクセスできます。
主要機能:
- スキーマ進化(Schema Evolution):カラムの追加/削除/リネーム時にデータの再書き込み不要
- パーティション進化(Partition Evolution):パーティションスキーマ変更時に既存データを保持
- タイムトラベル:特定時点のスナップショットでクエリ可能
- 隠しパーティション:ユーザーがパーティションを意識せずに自動最適化
- マルチエンジン:どのエンジンでも同一テーブルフォーマットを使用
-- Icebergテーブルの作成と活用
CREATE TABLE catalog.db.orders (
order_id BIGINT,
customer_id BIGINT,
amount DECIMAL(10,2),
status STRING,
ordered_at TIMESTAMP
)
USING iceberg
PARTITIONED BY (days(ordered_at));
-- タイムトラベル:昨日時点のデータを照会
SELECT * FROM catalog.db.orders
VERSION AS OF '2025-03-21T00:00:00';
-- スナップショットベースの増分読み取り
SELECT * FROM catalog.db.orders
WHERE ordered_at > (
SELECT max(ordered_at)
FROM catalog.db.orders
VERSION AS OF 'snapshot_id_123'
);
Tabular買収(2024年): DatabricksがIcebergの商用化企業Tabularを買収しました。これによりIcebergの商業エコシステムに大きな変化が生じ、Snowflakeや他のベンダーは独自のIcebergサポートを強化しています。
5.3 Delta Lake:Databricksエコシステムの核心
Delta LakeはDatabricksが開発したオープンソーステーブルフォーマットです。Sparkとの深い統合が強みです。
主要機能:
- UniForm:IcebergとHudi互換のメタデータを自動生成
- Liquid Clustering:従来のZ-Orderを置き換える自動データレイアウト最適化
- Change Data Feed:DeltaテーブルからCDCイベントを直接キャプチャ
- Deletion Vectors:ファイル再書き込みなしの効率的な削除/更新
# Delta Lake - UniFormでIceberg互換
from delta.tables import DeltaTable
# Deltaテーブル作成(UniForm有効化)
spark.sql("""
CREATE TABLE catalog.db.events (
event_id BIGINT,
event_type STRING,
payload STRING,
event_time TIMESTAMP
)
USING DELTA
TBLPROPERTIES (
'delta.universalFormat.enabledFormats' = 'iceberg'
)
""")
# DeltaテーブルのMERGE(Upsert)
delta_table = DeltaTable.forName(spark, "catalog.db.events")
delta_table.alias("target").merge(
new_events.alias("source"),
"target.event_id = source.event_id"
).whenMatchedUpdateAll() \
.whenNotMatchedInsertAll() \
.execute()
5.4 Apache Hudi:リアルタイムCDCの王者
Hudi(Hadoop Upserts Deletes and Incrementals)はUberが開発したテーブルフォーマットで、レコードレベルのインデックスとリアルタイムCDC処理に最適化されています。
主要機能:
- レコードレベルインデックス:個別レコードのUpsertが非常に高速
- Copy-on-Write vs Merge-on-Read:ワークロードに応じた最適戦略の選択
- 増分クエリ:変更されたレコードのみを効率的に読み取り
- 同時実行制御:楽観的同時実行制御
5.5 Iceberg vs Delta Lake vs Hudi 総合比較
| 特性 | Apache Iceberg | Delta Lake | Apache Hudi |
|---|---|---|---|
| 開発元 | Netflix(現Apache) | Databricks | Uber(現Apache) |
| 最適ユースケース | マルチエンジン、ペタバイト | Databricksエコシステム | リアルタイムCDC/Upsert |
| エンジンサポート | Spark、Flink、Trino、Presto | Spark(最適)、他は制限的 | Spark、Flink |
| スキーマ進化 | 最高(full evolution) | 良好 | 良好 |
| パーティション進化 | 最高(隠しパーティション) | Liquid Clustering | 制限的 |
| CDCサポート | 増分読み取りのみ | Change Data Feed | ネイティブ(最高) |
| タイムトラベル | スナップショットベース | バージョンベース | コミットタイムライン |
| 同時実行 | 楽観的(branch対応) | 楽観的 | 楽観的 |
| 互換性 | 標準(オープン) | UniForm(Iceberg互換) | 制限的 |
| カタログ | Polaris、REST、Hive | Unity Catalog | 自前タイムライン |
| コミュニティ規模 | 急成長中(最大) | Databricks主導 | 中程度 |
選択ガイド:
- マルチエンジン、ベンダー非依存 → Iceberg
- Databricks使用中 → Delta Lake(UniFormでIceberg互換を確保)
- リアルタイムCDC、頻繁なUpsert → Hudi
- 新規プロジェクト、最大の柔軟性 → Iceberg
6. リアルタイム分析(ぶんせき):ClickHouse vs Druid vs Pinot vs StarRocks
6.1 OLAPエンジンが必要な理由
レイクハウスにデータを保存したら、次はミリ秒単位で分析クエリを実行できるOLAPエンジンが必要です。PostgreSQLやMySQLでは数十億行規模の集計クエリをリアルタイムで処理できません。
6.2 ClickHouse:最速のオープンソースOLAP
ClickHouseはYandexが開発したカラムナーOLAPデータベースです。単一ノードでも毎秒数十億行をスキャンできます。
-- ClickHouse - リアルタイムダッシュボードクエリ
CREATE TABLE events (
event_id UInt64,
user_id UInt32,
event_type LowCardinality(String),
properties Map(String, String),
event_time DateTime64(3)
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(event_time)
ORDER BY (event_type, user_id, event_time);
-- Materialized Viewによるリアルタイム集計
CREATE MATERIALIZED VIEW hourly_events_mv
ENGINE = SummingMergeTree()
ORDER BY (event_type, hour)
AS SELECT
event_type,
toStartOfHour(event_time) AS hour,
count() AS event_count,
uniqHLL12(user_id) AS unique_users
FROM events
GROUP BY event_type, hour;
-- 数十億行からミリ秒レスポンス
SELECT
event_type,
sum(event_count) AS total_events,
sum(unique_users) AS total_users
FROM hourly_events_mv
WHERE hour >= now() - INTERVAL 24 HOUR
GROUP BY event_type
ORDER BY total_events DESC
LIMIT 20;
6.3 Apache Druid:リアルタイム取り込み+分析
Druidはリアルタイムデータの取り込みと分析を同時に処理するように設計されたOLAPデータベースです。Kafkaから直接データを取り込みながら、同時にクエリを処理できます。
6.4 Apache Pinot:LinkedInのリアルタイム分析
PinotはLinkedInが開発したOLAPデータベースで、ユーザー向け(user-facing)分析に最適化されています。LinkedInの「プロフィールを閲覧した人」、UberのUberEatsレストランダッシュボードなどに使用されています。
6.5 StarRocks:次世代OLAPの挑戦者(ちょうせんしゃ)
StarRocksはMySQL互換プロトコルをサポートする次世代OLAPエンジンです。別途のデータロードなしにIceberg、Hudi、Delta Lakeテーブルを直接クエリできるレイクハウス分析機能がユニークです。
6.6 OLAPエンジン総合比較
| 特性 | ClickHouse | Apache Druid | Apache Pinot | StarRocks |
|---|---|---|---|---|
| 開発元 | Yandex → ClickHouse Inc | Imply | LinkedIn → StarTree | CelerData |
| アーキテクチャ | 単一バイナリ | MSQ(複雑) | Helixベース | MPP(シンプル) |
| リアルタイム取込 | Kafkaエンジン | ネイティブ(最高) | ネイティブ(良好) | Routine Load |
| クエリ性能 | 最高(単一ノード) | 良好 | 良好 | 最高(MPP) |
| SQL互換 | ANSI SQL | Druid SQL | PQL + SQL | MySQL互換 |
| JOIN性能 | 制限的 | 制限的 | 制限的 | 良好(MPP) |
| レイクハウスクエリ | 制限的 | 制限的 | 制限的 | ネイティブ(最高) |
| 運用複雑度 | 低 | 高 | 中 | 低 |
| 学習曲線 | 低 | 高 | 中 | 低(MySQL) |
| スケーリング | 水平拡張 | 水平拡張 | 水平拡張 | 水平拡張 |
ベンチマーク(ClickBench 2024):
TPC-H 10GBクエリ性能(秒、低いほど良い):
┌──────────────────────────────────────────────────┐
│ StarRocks 3.x ████ 2.1秒(CHの2.2倍高速) │
│ ClickHouse █████████ 4.6秒 │
│ Druid ████████████████████ 18.7秒 │
│ Pinot ██████████████████ 16.3秒 │
└──────────────────────────────────────────────────┘
選択ガイド:
- 最高の単一ノード性能、シンプルな運用 → ClickHouse
- Kafkaネイティブのリアルタイム取り込み → Druid
- ユーザー向け分析、大規模 → Pinot
- レイクハウス直接クエリ、MySQL互換 → StarRocks
7. Data MeshとData Contracts
7.1 Data Mesh:分散型(ぶんさんがた)データアーキテクチャ
Data MeshはZhamak Dehghaniが提唱した分散型データアーキテクチャのパラダイムです。中央データチームがすべてのデータを管理する代わりに、ドメインチームが自分のデータプロダクト(Data Product)を所有し管理します。
Data Meshの4大原則:
1. ドメインオーナーシップ(Domain Ownership)
→ 各ドメインチームが自分のデータを所有
2. プロダクトとしてのデータ(Data as a Product)
→ データにSLA、ドキュメント、品質保証を適用
3. セルフサーブプラットフォーム(Self-Serve Platform)
→ インフラチームがデータプラットフォームツールを提供
4. 連合ガバナンス(Federated Governance)
→ 全社標準 + ドメイン自律性のバランス
Gartner 2025年予測:大企業の70%がData Meshのパイロットを実施中または計画中です。ただし、完全なData Mesh移行に成功した事例はまだ少数です。
7.2 Data Contracts:データAPIの約束
Data Contractはデータ生産者と消費者の間の公式な合意です。APIスペックのように、データのスキーマ、品質、SLAを明示します。
# data-contract.yml の例
dataContractSpecification: 0.9.3
id: orders-contract
info:
title: '注文データコントラクト'
version: 2.1.0
owner: order-domain-team
contact:
name: '注文チーム'
email: orders@company.com
servers:
production:
type: iceberg
catalog: polaris
database: orders_db
table: orders
models:
orders:
description: '完了した注文データ'
fields:
order_id:
type: bigint
required: true
unique: true
description: '注文の一意識別子'
customer_id:
type: bigint
required: true
amount:
type: decimal
required: true
minimum: 0
description: '注文金額(USD)'
ordered_at:
type: timestamp
required: true
quality:
type: SodaCL
specification:
checks for orders:
- row_count > 0
- missing_count(order_id) = 0
- duplicate_count(order_id) = 0
- avg(amount) between 10 and 500
sla:
freshness: 1 hour
availability: 99.9%
latency: p99 < 500ms
7.3 Data Mesh + Data Fabricハイブリッド
2025年の現実的なトレンドはData MeshとData Fabricのハイブリッドアプローチです。
Data Mesh + Fabricハイブリッド:
┌──────────────────────────┐
│ Data Fabricレイヤー │
│(統合ガバナンス/カタログ) │
└──────────┬───────────────┘
┌──────────────────┼──────────────────┐
│ │ │
┌──────┴──────┐ ┌──────┴──────┐ ┌──────┴──────┐
│注文ドメイン │ │顧客ドメイン │ │商品ドメイン │
│Data Product │ │Data Product │ │Data Product │
│ (Iceberg) │ │ (Iceberg) │ │ (Iceberg) │
└─────────────┘ └─────────────┘ └─────────────┘
ツールエコシステム:
- カタログ:OpenMetadata、DataHub、Amundsen
- 品質:Great Expectations、Soda、Monte Carlo
- コントラクト:Datakin、Schemata、Bitol
- リネージ:Marquez、OpenLineage
8. 実践アーキテクチャ:リアルタイムレコメンデーションシステム
8.1 要件定義(ようけんていぎ)
大規模ECプラットフォームのリアルタイムパーソナライズドレコメンデーションシステムを構築すると仮定します。
要件:
- 日間アクティブユーザー:500万人
- 秒間イベント数:50,000件
- レコメンデーションレイテンシ:p99 < 100ms
- データソース:クリックストリーム、購買、検索、在庫
- フィーチャーストア:リアルタイム + バッチフィーチャーの結合
- A/Bテスト:モデルバージョン別のパフォーマンス比較
8.2 アーキテクチャ設計(せっけい)
リアルタイムレコメンデーションシステムアーキテクチャ:
[クリック/購買/検索イベント]
│
▼
┌─────────┐ ┌──────────────┐
│ Kafka │────→│ Flink (CEP) │──→ リアルタイムフィーチャー計算
│ Cluster │ │ ウィンドウ集約 │ (直近5分のクリックカテゴリ)
└────┬────┘ └──────┬───────┘
│ │
▼ ▼
┌─────────┐ ┌──────────────┐
│ Iceberg │ │ Redis │──→ リアルタイムフィーチャーサービング
│ (生データ)│ │Feature Store│ (p99 < 5ms)
└────┬────┘ └──────────────┘
│ ↑
▼ │
┌─────────┐ ┌──────────────┐
│ dbt │────→│ ClickHouse │──→ バッチフィーチャー計算
│ (変換) │ │ (集約/分析) │ (30日間の購買パターン)
└────┬────┘ └──────────────┘
│
▼
┌─────────────────┐ ┌──────────────┐
│ ML Model Serving │←───│Feature Store │
│ (TorchServe/ │ │(Redis+DuckDB)│
│ Triton) │ └──────────────┘
└────────┬────────┘
│
▼
┌─────────────────┐
│ API Gateway │──→ ユーザーにレコメンデーション結果を提供
│ (p99 < 100ms) │
└─────────────────┘
8.3 コア実装コード
Flink リアルタイムフィーチャー計算:
// リアルタイムユーザー行動フィーチャー計算
DataStream<UserFeature> realtimeFeatures = clickEvents
.keyBy(ClickEvent::getUserId)
.window(SlidingEventTimeWindows.of(
Time.minutes(5), Time.minutes(1)))
.aggregate(new UserBehaviorAggregator());
// Redisフィーチャーストアに保存
realtimeFeatures.addSink(
new RedisSink<>(redisConfig, new FeatureRedisMapper()));
dbt バッチフィーチャーモデル:
-- models/features/user_purchase_patterns.sql
-- 30日間の購買パターンフィーチャー(バッチ)
WITH purchase_stats AS (
SELECT
customer_id,
COUNT(*) AS purchase_count_30d,
SUM(amount_dollars) AS total_spend_30d,
AVG(amount_dollars) AS avg_order_value_30d,
COUNT(DISTINCT category) AS unique_categories_30d,
MAX(ordered_at) AS last_purchase_at
FROM {{ ref('fct_revenue') }}
WHERE ordered_at >= CURRENT_DATE - INTERVAL '30' DAY
GROUP BY customer_id
)
SELECT
customer_id,
purchase_count_30d,
total_spend_30d,
avg_order_value_30d,
unique_categories_30d,
DATEDIFF('day', last_purchase_at, CURRENT_DATE) AS days_since_last_purchase
FROM purchase_stats
Airflow DAG:
# レコメンデーションシステムの日次パイプライン
@dag(schedule="0 2 * * *", catchup=False)
def recommendation_pipeline():
@task()
def run_dbt_features():
"""dbtでバッチフィーチャーを生成"""
import subprocess
result = subprocess.run(
["dbt", "run", "--select", "features+"],
capture_output=True, text=True
)
return result.returncode == 0
@task()
def export_to_feature_store(dbt_success: bool):
"""バッチフィーチャーをFeature Storeにエクスポート"""
if not dbt_success:
raise Exception("dbt実行失敗")
# ClickHouse → Redis Feature Storeの同期
pass
@task()
def retrain_model():
"""MLモデルの再訓練"""
# 日次モデル再訓練ロジック
pass
@task()
def validate_model(retrain_result):
"""モデル性能の検証"""
# A/Bテストメトリクスの比較
pass
dbt_result = run_dbt_features()
export = export_to_feature_store(dbt_result)
retrain = retrain_model()
validate_model(retrain)
recommendation_pipeline()
8.4 コスト最適化(さいてきか)
月間推定コスト(AWS基準、日間500万ユーザー):
| コンポーネント | インスタンスタイプ | 月額コスト |
|-----------------|----------------------|--------------|
| Kafka (MSK) | kafka.m5.2xlarge x3 | 約2,100ドル |
| Flink (EMR) | m5.2xlarge x4 | 約2,800ドル |
| Iceberg (S3) | 50TBストレージ | 約1,150ドル |
| ClickHouse | m5.4xlarge x3 | 約4,200ドル |
| Redis | r6g.2xlarge x2 | 約1,800ドル |
| Airflow (MWAA) | mw1.medium | 約350ドル |
合計推定コスト:約12,400ドル/月
コスト最適化戦略:
1. Spotインスタンスの活用(Flinkワーカー)→ 60%削減
2. Icebergコンパクション最適化 → ストレージ30%削減
3. ClickHouse TTLポリシー → 古いデータの自動削除
4. Reserved Instance → 長期ワークロード40%削減
9. 資格(しかく)と学習ロードマップ
9.1 2025年推奨資格
| 資格 | 提供元 | 難易度 | 核心内容 | 推奨対象 |
|---|---|---|---|---|
| DP-700 | Microsoft | 中 | Fabric Analytics Engineer | Azureエコシステム |
| Data Engineer Associate | Databricks | 中 | Spark、Delta Lake、Unity | Databricksユーザー |
| Professional DE | Google Cloud | 高 | BigQuery、Dataflow、GCS | GCPエコシステム |
| Data Engineer | AWS (DEA-C01) | 中 | Glue、Redshift、EMR | AWSエコシステム |
| dbt Analytics Engineering | dbt Labs | 低〜中 | dbt Core、モデリング | アナリティクスエンジニア |
| CCA Spark and Hadoop | Cloudera | 中 | Spark、HDFS、Hive | オンプレミス |
9.2 12ヶ月学習(がくしゅう)ロードマップ
12ヶ月データエンジニア学習パス:
[1〜3ヶ月:基礎]
├── SQL上級(ウィンドウ関数、CTE、最適化)
├── Pythonデータ処理(pandas、polars)
├── Linux / Docker基礎
└── Git / CI/CD基礎
[4〜6ヶ月:コアツール]
├── Apache Spark(DataFrame API、SparkSQL)
├── dbt(プロジェクト構造、テスト、ドキュメント化)
├── Airflow(DAG記述、オペレーター)
└── Kafka基礎(プロデューサー、コンシューマー、トピック)
[7〜9ヶ月:上級]
├── Apache Flink(ストリーム処理、状態管理)
├── Iceberg / Delta Lake(レイクハウス)
├── ClickHouse(OLAP分析)
└── Great Expectations(データ品質)
[10〜12ヶ月:実践&資格]
├── ポートフォリオプロジェクト3つ完成
├── 資格1〜2つ取得
├── Data Mesh / ガバナンス学習
└── 技術ブログの執筆開始
9.3 推奨学習リソース
無料リソース:
- DataTalksClub DE Zoomcamp:無料オンラインブートキャンプ(16週間)
- Databricks Academy:Spark、Delta Lake無料コース
- dbt Learn:公式dbtチュートリアル
- ClickHouse University:公式無料コース
有料リソース:
- Zach WilsonのData Engineering Bootcamp:実践プロジェクト中心
- O'Reilly "Fundamentals of Data Engineering":バイブル
- Udemy "Apache Flink Master Class":Flink上級
10. ポートフォリオプロジェクト3選
プロジェクト1:リアルタイムタクシー料金予測パイプライン
技術スタック:Kafka + Flink + Iceberg + dbt + ClickHouse
アーキテクチャ:
NYCタクシーデータ(API) → Kafka → Flink(リアルタイムフィーチャー) → Iceberg
↓
dbt(バッチ変換)
↓
ClickHouse(ダッシュボード)
実装ポイント:
1. Flinkでリアルタイム地域別需要予測フィーチャーを生成
2. Icebergパーティション進化の活用(日別 → 時間別)
3. dbt増分モデルで日次集計
4. ClickHouse Materialized Viewでリアルタイムダッシュボード
5. Airflow DAGで全体パイプラインをオーケストレーション
プロジェクト2:EC CDC パイプライン
技術スタック:Debezium + Kafka + Spark + Delta Lake + dbt
アーキテクチャ:
PostgreSQL(OLTP) → Debezium(CDC) → Kafka → Spark Streaming → Delta Lake
↓
dbt(階層的変換)
↓
Superset(BIダッシュボード)
実装ポイント:
1. DebeziumでPostgreSQLの変更をリアルタイムキャプチャ
2. Spark Structured StreamingでCDCイベントを処理
3. Delta Lake MERGEでSCD Type 2を実装
4. dbtでstaging/intermediate/marts構造化
5. Supersetで売上/在庫リアルタイムダッシュボード
プロジェクト3:Data ContractベースのData Mesh
技術スタック:OpenMetadata + Soda + dbt + Iceberg + Dagster
アーキテクチャ:
ドメインA(注文) ──→ Data Contract (YAML) ──→ Iceberg
ドメインB(顧客) ──→ Data Contract (YAML) ──→ Iceberg
ドメインC(商品) ──→ Data Contract (YAML) ──→ Iceberg
↓
OpenMetadata(カタログ/リネージ)
Soda(品質検証)
Dagster(オーケストレーション)
実装ポイント:
1. 3ドメインのData Contract YAMLを定義
2. Sodaで自動データ品質検証
3. OpenMetadataでリネージとカタログを管理
4. Dagster Software-Defined Assetsでパイプラインを構築
5. 全社メトリクスレイヤー(MetricFlow)
クイズ
クイズ1:ストリーム処理エンジンの選択
Q:クレジットカード不正検知システムを構築する必要があります。トランザクション発生後50ms以内に判断する必要があり、直近10分間の取引パターンを分析する必要があります。どのストリーム処理エンジンが最も適していますか?
A:Apache Flink
Flinkが最適な理由:
- イベント単位処理:Flinkは真のイベント単位処理を行うため、トランザクション一つ一つを即座に処理できます。
- サブミリ秒レイテンシ:Sparkのマイクロバッチ(最小100ms以上)と異なり、Flinkはミリ秒単位のレイテンシを保証します。
- チェックポイントベースの状態管理:10分スライディングウィンドウの状態をRocksDBで安定的に維持し、exactly-onceセマンティクスを保証します。
- CEP(Complex Event Processing):Flink CEPライブラリで複雑な不正パターンを宣言的に定義できます。
Sparkはマイクロバッチの特性上50msの制約を満たすのが難しく、Beamはランナーによって性能が変わるため、このシナリオではFlinkが最善です。
クイズ2:レイクハウスフォーマットの選択
Q:会社でSpark、Trino、Flinkの3つのエンジンをすべて使用しており、毎日数百GBのCDCデータを処理しています。スキーマが頻繁に変更される状況で、どのテーブルフォーマットを選択すべきですか?
A:Apache Iceberg
Icebergが最適な理由:
- マルチエンジンサポート:Spark、Trino、FlinkのすべてがIcebergをファーストクラスでサポートしています。Delta LakeはSpark以外のエンジンサポートが制限的で、HudiはTrinoのサポートが弱いです。
- スキーマ進化:Icebergはfull schema evolutionをサポートします。カラムの追加、削除、リネーム、型変更時に既存データを再書き込みする必要がありません。
- パーティション進化:隠しパーティションにより、パーティションスキーマの変更が既存データやクエリに影響を与えません。
ただし、非常に頻繁なレコードレベルのUpsertが核心要件であればHudiを検討できますが、マルチエンジンとスキーマ進化を優先する場合、Icebergが最善の選択です。
クイズ3:dbtプロジェクト構造
Q:dbtプロジェクトにおけるstagingモデルとmartsモデルの違いは何ですか?なぜこのレイヤー構造が必要ですか?
A:
stagingモデル:
- ソースデータを1:1でマッピングして整理するレイヤー
- カラムリネーム、型キャスト、フィルタリングなど基本的な変換のみ実行
- ビジネスロジックを含まない
- ソースごとに1つのstagingモデルを作成
martsモデル:
- ビジネス上の質問に答える最終分析用テーブル
- 複数のstaging/intermediateモデルをJOINしてビジネスロジックを適用
- fact(ファクト)とdimension(ディメンション)テーブルに分類
- ビジネスドメイン別にグループ化(finance、marketingなど)
レイヤー構造が必要な理由:
- DRY原則:ソース変更時にstagingのみ修正すれば、下流のすべてのモデルに反映
- テスト容易性:各レイヤーで独立したテストが可能
- デバッグ:問題発生時にどのレイヤーで発生したか素早く特定
- チーム協力:アナリストはmartsのみ、エンジニアはstagingを管理
クイズ4:オーケストレーターの選択
Q:5人規模のアナリティクスエンジニアリングチームで、dbt中心のデータパイプラインを運用したいです。Airflowの経験がなく、できるだけ早く本番環境を構築する必要があります。どのオーケストレーターを推奨しますか?
A:Dagster
Dagsterが最適な理由:
- dbtネイティブ統合:DagsterはdbtプロジェクトをSoftware-Defined Assetsに自動変換します。dbtモデル間の依存関係がDagsterアセットグラフに自動的に反映されます。
- 低い学習曲線(dbtユーザー向け):dbtユーザーにとってDagsterのアセット中心パラダイムは自然です。AirflowのDAG/Operatorの概念より直感的です。
- 迅速な本番環境構築:Dagster Cloudを使えばインフラ管理なしですぐに開始できます。
- 可観測性:アセットの具体化(materialization)履歴、データリネージ、メタデータを自動的に追跡します。
Airflowは未経験のチームにとって初期設定と運用が複雑で、Prefectはdbt統合がDagsterほど深くありません。
クイズ5:OLAPエンジンの選択
Q:すでにIcebergレイクハウスを構築しており、別途のデータロードなしにIcebergテーブルに直接分析クエリを実行したいです。既存チームがMySQLに慣れています。どのOLAPエンジンが最も適していますか?
A:StarRocks
StarRocksが最適な理由:
- レイクハウスネイティブクエリ:StarRocksはIceberg、Delta Lake、Hudiテーブルに直接クエリできます。データを別途ロード(ingestion)する必要がなく、データの重複と同期コストを削減できます。
- MySQL互換プロトコル:MySQLクライアントとドライバーをそのまま使用できるため、MySQLに慣れたチームがすぐに適応できます。
- MPPアーキテクチャ:大規模JOINクエリでClickHouseより優れた性能を発揮します。
- シンプルな運用:シンプルなアーキテクチャでDruidと比較して運用がはるかに簡単です。
ClickHouseはIceberg直接クエリのサポートが制限的で、Druid/Pinotは運用複雑度が高くMySQL互換ではありません。
参考資料(さんこうしりょう)
公式ドキュメント
- Apache Flink Documentation — Flink公式ドキュメント
- Apache Spark Documentation — Spark公式ドキュメント
- dbt Documentation — dbt公式ドキュメント
- Apache Iceberg Documentation — Iceberg公式ドキュメント
- ClickHouse Documentation — ClickHouse公式ドキュメント
- Apache Airflow Documentation — Airflow公式ドキュメント
- Dagster Documentation — Dagster公式ドキュメント
アーキテクチャと比較
- Nexocode: Flink vs Spark vs Beam Benchmark 2024 — ストリーム処理エンジンベンチマーク
- Databricks: Delta Lake UniForm — Delta UniForm公式ドキュメント
- ClickBench: OLAP Database Benchmarks — OLAP性能比較
- Data Mesh Architecture by Zhamak Dehghani — Data Meshの原則とアーキテクチャ
学習リソース
- DataTalksClub Data Engineering Zoomcamp — 無料ブートキャンプ
- O'Reilly: Fundamentals of Data Engineering — データエンジニアリングのバイブル
- dbt Learn — dbt公式学習コース
- Databricks Academy — Spark/Delta無料コース
- Apache Iceberg: The Definitive Guide (O'Reilly) — Iceberg上級学習
トレンドと分析
- Gartner: Modern Data Stack Trends 2025 — データエンジニアリングトレンド
- a16z: The Modern Data Stack (2024 Update) — VCの視点からのデータスタック分析