Skip to content
Published on

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

Authors

はじめに

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.xAirflow 3.0 / Dagster
フォーマットParquet/ORCIceberg/Delta/Hudi
カタログHive MetastoreUnity Catalog / Polaris
品質手動検証Great Expectations / Soda

1.3 技術スタック選択フレームワーク

データスタック選択時に考慮すべき主要基準:

評価基準チェックリスト:
1. レイテンシ要件(バッチ vs ニアリアルタイム vs リアルタイム)
2. データ量(GB/日 vs TB/日 vs PB/日)
3. チーム規模と能力(SQL中心 vs コード中心)
4. ベンダーロックイン許容範囲
5. 予算(オープンソース vs マネージドサービス)
6. 規制要件(データガバナンス、リネージ)

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'))
特性Apache FlinkSpark Structured StreamingApache Beam
処理モデル真のイベント単位マイクロバッチ統一API(ランナー依存)
レイテンシミリ秒〜サブ秒秒単位(100ms〜)ランナー依存
状態管理内蔵チェックポイント、RocksDB制限的(ウォーターマーク)ランナー依存
精度Exactly-onceがデフォルトExactly-once可能ランナー依存
SQL対応Flink SQL(強力)Spark SQL(最高)Beam SQL(制限的)
バッチ処理良好(bounded stream)最高(ネイティブ)良好
ML統合制限的MLlib / Spark MLTFX統合
学習曲線急峻中程度急峻
主要ユースケースリアルタイムCEP、不正検知バッチ+ストリームハイブリッドマルチエンジン移植性
代表的ユーザーAlibaba、Uber、NetflixDatabricks顧客全体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.0DagsterPrefectMage
パラダイムDAG/タスク中心アセット中心フロー/タスクノートブック+パイプライン
学習曲線中〜高
dbt統合Provider経由ネイティブ(最高)基本サポート基本サポート
UIReact(大幅改善)Dagit(優秀)Cloud UIノートブックスタイル
スケーリングKubernetesExecutorK8s / ECSKubernetesKubernetes
コミュニティ最大(10年以上)急成長中中程度成長中
Providerエコシステム1000以上100以上200以上50以上
障害処理中程度良好最高良好
価格(Cloud)MWAA費用Dagster+Prefect CloudMage 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など)内蔵スケジューラー
IDEVS Code + 拡張機能Cloud IDE(ブラウザ)
Semantic LayerMetricFlow 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 IcebergDelta LakeApache Hudi
開発元Netflix(現Apache)DatabricksUber(現Apache)
最適ユースケースマルチエンジン、ペタバイトDatabricksエコシステムリアルタイムCDC/Upsert
エンジンサポートSpark、Flink、Trino、PrestoSpark(最適)、他は制限的Spark、Flink
スキーマ進化最高(full evolution)良好良好
パーティション進化最高(隠しパーティション)Liquid Clustering制限的
CDCサポート増分読み取りのみChange Data Feedネイティブ(最高)
タイムトラベルスナップショットベースバージョンベースコミットタイムライン
同時実行楽観的(branch対応)楽観的楽観的
互換性標準(オープン)UniForm(Iceberg互換)制限的
カタログPolaris、REST、HiveUnity 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エンジン総合比較

特性ClickHouseApache DruidApache PinotStarRocks
開発元Yandex → ClickHouse IncImplyLinkedIn → StarTreeCelerData
アーキテクチャ単一バイナリMSQ(複雑)HelixベースMPP(シンプル)
リアルタイム取込Kafkaエンジンネイティブ(最高)ネイティブ(良好)Routine Load
クエリ性能最高(単一ノード)良好良好最高(MPP)
SQL互換ANSI SQLDruid SQLPQL + SQLMySQL互換
JOIN性能制限的制限的制限的良好(MPP)
レイクハウスクエリ制限的制限的制限的ネイティブ(最高)
運用複雑度
学習曲線低(MySQL)
スケーリング水平拡張水平拡張水平拡張水平拡張

ベンチマーク(ClickBench 2024):

TPC-H 10GBクエリ性能(秒、低いほど良い):
┌──────────────────────────────────────────────────┐
StarRocks 3.x  ████  2.1秒(CH2.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-700MicrosoftFabric Analytics EngineerAzureエコシステム
Data Engineer AssociateDatabricksSpark、Delta Lake、UnityDatabricksユーザー
Professional DEGoogle CloudBigQuery、Dataflow、GCSGCPエコシステム
Data EngineerAWS (DEA-C01)Glue、Redshift、EMRAWSエコシステム
dbt Analytics Engineeringdbt Labs低〜中dbt Core、モデリングアナリティクスエンジニア
CCA Spark and HadoopClouderaSpark、HDFS、Hiveオンプレミス

9.2 12ヶ月学習(がくしゅう)ロードマップ

12ヶ月データエンジニア学習パス:

[13ヶ月:基礎]
├── SQL上級(ウィンドウ関数、CTE、最適化)
├── Pythonデータ処理(pandas、polars)
├── Linux / Docker基礎
└── Git / CI/CD基礎

[46ヶ月:コアツール]
├── Apache Spark(DataFrame API、SparkSQL)
├── dbt(プロジェクト構造、テスト、ドキュメント化)
├── Airflow(DAG記述、オペレーター)
└── Kafka基礎(プロデューサー、コンシューマー、トピック)

[79ヶ月:上級]
├── Apache Flink(ストリーム処理、状態管理)
├── Iceberg / Delta Lake(レイクハウス)
├── ClickHouse(OLAP分析)
└── Great Expectations(データ品質)

[1012ヶ月:実践&資格]
├── ポートフォリオプロジェクト3つ完成
├── 資格12つ取得
├── 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)KafkaFlink(リアルタイムフィーチャー)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)KafkaSpark StreamingDelta Lake
                                                       dbt(階層的変換)
                                                     Superset(BIダッシュボード)

実装ポイント:
1. DebeziumでPostgreSQLの変更をリアルタイムキャプチャ
2. Spark Structured StreamingでCDCイベントを処理
3. Delta Lake MERGESCD 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が最適な理由:

  1. イベント単位処理:Flinkは真のイベント単位処理を行うため、トランザクション一つ一つを即座に処理できます。
  2. サブミリ秒レイテンシ:Sparkのマイクロバッチ(最小100ms以上)と異なり、Flinkはミリ秒単位のレイテンシを保証します。
  3. チェックポイントベースの状態管理:10分スライディングウィンドウの状態をRocksDBで安定的に維持し、exactly-onceセマンティクスを保証します。
  4. CEP(Complex Event Processing):Flink CEPライブラリで複雑な不正パターンを宣言的に定義できます。

Sparkはマイクロバッチの特性上50msの制約を満たすのが難しく、Beamはランナーによって性能が変わるため、このシナリオではFlinkが最善です。

クイズ2:レイクハウスフォーマットの選択

Q:会社でSpark、Trino、Flinkの3つのエンジンをすべて使用しており、毎日数百GBのCDCデータを処理しています。スキーマが頻繁に変更される状況で、どのテーブルフォーマットを選択すべきですか?

A:Apache Iceberg

Icebergが最適な理由:

  1. マルチエンジンサポート:Spark、Trino、FlinkのすべてがIcebergをファーストクラスでサポートしています。Delta LakeはSpark以外のエンジンサポートが制限的で、HudiはTrinoのサポートが弱いです。
  2. スキーマ進化:Icebergはfull schema evolutionをサポートします。カラムの追加、削除、リネーム、型変更時に既存データを再書き込みする必要がありません。
  3. パーティション進化:隠しパーティションにより、パーティションスキーマの変更が既存データやクエリに影響を与えません。

ただし、非常に頻繁なレコードレベルのUpsertが核心要件であればHudiを検討できますが、マルチエンジンとスキーマ進化を優先する場合、Icebergが最善の選択です。

クイズ3:dbtプロジェクト構造

Q:dbtプロジェクトにおけるstagingモデルとmartsモデルの違いは何ですか?なぜこのレイヤー構造が必要ですか?

A:

stagingモデル:

  • ソースデータを1:1でマッピングして整理するレイヤー
  • カラムリネーム、型キャスト、フィルタリングなど基本的な変換のみ実行
  • ビジネスロジックを含まない
  • ソースごとに1つのstagingモデルを作成

martsモデル:

  • ビジネス上の質問に答える最終分析用テーブル
  • 複数のstaging/intermediateモデルをJOINしてビジネスロジックを適用
  • fact(ファクト)とdimension(ディメンション)テーブルに分類
  • ビジネスドメイン別にグループ化(finance、marketingなど)

レイヤー構造が必要な理由:

  1. DRY原則:ソース変更時にstagingのみ修正すれば、下流のすべてのモデルに反映
  2. テスト容易性:各レイヤーで独立したテストが可能
  3. デバッグ:問題発生時にどのレイヤーで発生したか素早く特定
  4. チーム協力:アナリストはmartsのみ、エンジニアはstagingを管理

クイズ4:オーケストレーターの選択

Q:5人規模のアナリティクスエンジニアリングチームで、dbt中心のデータパイプラインを運用したいです。Airflowの経験がなく、できるだけ早く本番環境を構築する必要があります。どのオーケストレーターを推奨しますか?

A:Dagster

Dagsterが最適な理由:

  1. dbtネイティブ統合:DagsterはdbtプロジェクトをSoftware-Defined Assetsに自動変換します。dbtモデル間の依存関係がDagsterアセットグラフに自動的に反映されます。
  2. 低い学習曲線(dbtユーザー向け):dbtユーザーにとってDagsterのアセット中心パラダイムは自然です。AirflowのDAG/Operatorの概念より直感的です。
  3. 迅速な本番環境構築:Dagster Cloudを使えばインフラ管理なしですぐに開始できます。
  4. 可観測性:アセットの具体化(materialization)履歴、データリネージ、メタデータを自動的に追跡します。

Airflowは未経験のチームにとって初期設定と運用が複雑で、Prefectはdbt統合がDagsterほど深くありません。

クイズ5:OLAPエンジンの選択

Q:すでにIcebergレイクハウスを構築しており、別途のデータロードなしにIcebergテーブルに直接分析クエリを実行したいです。既存チームがMySQLに慣れています。どのOLAPエンジンが最も適していますか?

A:StarRocks

StarRocksが最適な理由:

  1. レイクハウスネイティブクエリ:StarRocksはIceberg、Delta Lake、Hudiテーブルに直接クエリできます。データを別途ロード(ingestion)する必要がなく、データの重複と同期コストを削減できます。
  2. MySQL互換プロトコル:MySQLクライアントとドライバーをそのまま使用できるため、MySQLに慣れたチームがすぐに適応できます。
  3. MPPアーキテクチャ:大規模JOINクエリでClickHouseより優れた性能を発揮します。
  4. シンプルな運用:シンプルなアーキテクチャでDruidと比較して運用がはるかに簡単です。

ClickHouseはIceberg直接クエリのサポートが制限的で、Druid/Pinotは運用複雑度が高くMySQL互換ではありません。


参考資料(さんこうしりょう)

公式ドキュメント

  1. Apache Flink Documentation — Flink公式ドキュメント
  2. Apache Spark Documentation — Spark公式ドキュメント
  3. dbt Documentation — dbt公式ドキュメント
  4. Apache Iceberg Documentation — Iceberg公式ドキュメント
  5. ClickHouse Documentation — ClickHouse公式ドキュメント
  6. Apache Airflow Documentation — Airflow公式ドキュメント
  7. Dagster Documentation — Dagster公式ドキュメント

アーキテクチャと比較

  1. Nexocode: Flink vs Spark vs Beam Benchmark 2024 — ストリーム処理エンジンベンチマーク
  2. Databricks: Delta Lake UniForm — Delta UniForm公式ドキュメント
  3. ClickBench: OLAP Database Benchmarks — OLAP性能比較
  4. Data Mesh Architecture by Zhamak Dehghani — Data Meshの原則とアーキテクチャ

学習リソース

  1. DataTalksClub Data Engineering Zoomcamp — 無料ブートキャンプ
  2. O'Reilly: Fundamentals of Data Engineering — データエンジニアリングのバイブル
  3. dbt Learn — dbt公式学習コース
  4. Databricks Academy — Spark/Delta無料コース
  5. Apache Iceberg: The Definitive Guide (O'Reilly) — Iceberg上級学習

トレンドと分析

  1. Gartner: Modern Data Stack Trends 2025 — データエンジニアリングトレンド
  2. a16z: The Modern Data Stack (2024 Update) — VCの視点からのデータスタック分析