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년 데이터 엔지니어가 주목받는 세 가지 이유가 있습니다.

첫째, 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년 주요 변화:

영역20202025
스토리지Data Lake (원시)Lakehouse (ACID)
처리배치 중심스트림 우선
변환Stored Proceduredbt + 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
           (고정)   (슬라이딩) (세션)

Flink는 이벤트 단위(event-by-event) 처리를 기본으로 하는 스트림 처리 엔진입니다. 배치는 스트림의 특수한 경우(bounded stream)로 취급합니다.

핵심 강점:

  • 서브초(sub-second) 지연: 이벤트 발생 후 밀리초 내 처리
  • 체크포인트 기반 상태 관리: 정확히 한 번(exactly-once) 보장
  • 이벤트 시간 처리: 워터마크를 통한 정확한 시간 기반 처리
  • Savepoint: 애플리케이션 업그레이드 시 상태 보존
// 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 기반 Modern UI
   - 실시간 로그 스트리밍
   - DAG 시각화 개선
   - 다크 모드 지원

2. Event-Driven 스케줄링
   - Dataset-aware 스케줄링 (데이터 도착 시 자동 트리거)
   - External Trigger 강화

3. TaskFlow API 2.0
   - 데코레이터 기반 Python 네이티브 DAG 작성
   - 동적 태스크 매핑 개선

4. Edge Labels & DAG Versioning
   - 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)**을 중심으로 파이프라인을 정의합니다.

핵심 차별점:

  • 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/태스크 중심자산(Asset) 중심플로우/태스크노트북+파이프라인
학습 곡선중간~높음중간낮음낮음
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+ 돌파, de facto standard 지위 확립

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/성능

전통 아키텍처:
[Sources][Data Lake (S3)][ETL][Data Warehouse (Redshift)]
                                         비용 높음, 중복 저장

레이크하우스 아키텍처:
[Sources][Object Storage (S3)] + [Table Format (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: CDC 이벤트를 Delta 테이블에서 직접 캡처
  • 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 처리에 최적화되어 있습니다.

핵심 기능:

  • 레코드 레벨 인덱스: 개별 레코드 업서트가 매우 빠름
  • Copy-on-Write vs Merge-on-Read: 워크로드에 따른 최적 전략 선택
  • Incremental Query: 변경된 레코드만 효율적으로 읽기
  • Concurrency Control: 낙관적 동시성 제어

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)좋음좋음
파티션 진화최고 (hidden partitioning)Liquid Clustering제한적
CDC 지원증분 읽기만Change Data Feed네이티브 (최고)
타임 트래블스냅샷 기반버전 기반커밋 타임라인
동시성Optimistic (branch 지원)OptimisticOptimistic
호환성표준 (오픈)UniForm (Iceberg 호환)제한적
카탈로그Polaris, REST, HiveUnity Catalog자체 타임라인
커뮤니티 규모빠르게 성장 (최대)Databricks 주도중간

선택 가이드:

  • 멀티 엔진, 벤더 독립 → Iceberg
  • Databricks 사용 중 → Delta Lake (UniForm으로 Iceberg 호환 확보)
  • 실시간 CDC, 빈번한 업서트 → 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의 "Who viewed your profile", 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 호환
조인 성능제한적제한적제한적좋음 (MPP)
레이크하우스 쿼리제한적제한적제한적네이티브 (최고)
운영 복잡도낮음높음중간낮음
학습 곡선낮음높음중간낮음 (MySQL)
스케일링수평 확장수평 확장수평 확장수평 확장

벤치마크 (ClickBench 2024):

TPC-H 10GB 쿼리 성능 (, 낮을수록 좋음):
┌──────────────────────────────────────────────────┐
StarRocks 3.x  ████  2.1s (2.2x faster than CH)ClickHouse     █████████  4.6s                   │
Druid          ████████████████████  18.7s       │
Pinot          ██████████████████  16.3s         │
└──────────────────────────────────────────────────┘

선택 가이드:

  • 최고 단일노드 성능, 간단한 운영 → 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 Layer                      (통합 거버넌스/카탈로그)                    └────────┬────────────┘
            ┌────────────────┼────────────────┐
            │                │                │
     ┌──────┴──────┐  ┌─────┴──────┐  ┌──────┴──────┐
     │ 주문 도메인  │  │ 고객 도메인  │  │ 상품 도메인  │
Data Product │  │ Data Product│Data Product       (Iceberg)  (Iceberg)  (Iceberg)     └─────────────┘  └────────────┘  └─────────────┘

도구 생태계:

  • 카탈로그: OpenMetadata, DataHub, Amundsen
  • 품질: Great Expectations, Soda, Montecarlo
  • 계약: Datakin, Schemata, Bitol
  • 리니지: Marquez, OpenLineage

8. 실전 아키텍처: 실시간 추천 시스템

8.1 요구사항

대규모 이커머스 플랫폼의 실시간 개인화 추천 시스템을 구축한다고 가정합니다.

요구사항:
- 일일 활성 사용자: 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 피처 스토어 동기화
        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-700Microsoft중간Fabric Analytics EngineerAzure 생태계
Data Engineer AssociateDatabricks중간Spark, Delta Lake, UnityDatabricks 사용자
Professional DEGoogle Cloud높음BigQuery, Dataflow, GCSGCP 생태계
Data EngineerAWS (DEA-C01)중간Glue, Redshift, EMRAWS 생태계
dbt Analytics Engineeringdbt Labs낮음~중간dbt Core, 모델링분석 엔지니어
CCA Spark and HadoopCloudera중간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 마스터 클래스": 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: E-Commerce 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 세 가지 엔진을 모두 사용하고 있으며, 매일 수백 GB의 CDC 데이터를 처리합니다. 스키마가 자주 변경되는 상황에서 어떤 테이블 포맷을 선택해야 할까요?

A: Apache Iceberg

Iceberg가 최적인 이유:

  1. 멀티 엔진 지원: Spark, Trino, Flink 모두 Iceberg를 1등급(first-class)으로 지원합니다. Delta Lake는 Spark 외 엔진 지원이 제한적이고, Hudi는 Trino 지원이 약합니다.
  2. 스키마 진화: Iceberg는 full schema evolution을 지원합니다. 칼럼 추가, 삭제, 이름 변경, 타입 변경 시 기존 데이터를 재작성할 필요가 없습니다.
  3. 파티션 진화: Hidden partitioning으로 파티션 스키마가 변경되어도 기존 데이터와 쿼리에 영향이 없습니다.

단, CDC 처리가 매우 빈번한 레코드 수준 업서트가 핵심이라면 Hudi를 검토할 수 있지만, 멀티 엔진과 스키마 진화를 우선시한다면 Iceberg가 최선의 선택입니다.

퀴즈 3: dbt 프로젝트 구조

Q: dbt 프로젝트에서 staging 모델과 marts 모델의 차이점은 무엇이며, 왜 이런 계층 구조가 필요할까요?

A:

staging 모델:

  • 원본 데이터(source)를 1:1로 매핑하여 정제하는 레이어
  • 칼럼 이름 변경, 타입 캐스팅, 필터링 등 기본 변환만 수행
  • 비즈니스 로직을 포함하지 않음
  • 소스당 하나의 staging 모델 생성

marts 모델:

  • 비즈니스 질문에 답하는 최종 분석용 테이블
  • 여러 staging/intermediate 모델을 조인하여 비즈니스 로직 적용
  • 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 아키텍처: 대규모 조인 쿼리에서 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. [a]16z: The Modern Data Stack (2024 Update)](https://a16z.com/) — VC 관점의 데이터 스택 분석