전체 그래프
Tools

Delta Lake

data-engineeringlakehousedelta-laketable-format

상위: Lakehouse Architecture

Delta Lake

요약

Delta Lake는 Databricks에서 개발한 오픈소스 스토리지 레이어로, 데이터 레이크에 ACID 트랜잭션, 스키마 관리, 타임 트래블을 제공한다. Apache Spark과 가장 깊게 통합되어 있으며, Transaction Log 기반의 변경 추적과 Change Data Feed, UniForm 호환성 레이어가 특징이다.

아키텍처: Transaction Log (_delta_log)

Delta Lake의 핵심은 _delta_log 디렉토리이다. 테이블에 대한 모든 변경 사항을 순서대로 기록한다.

my_table/
├── _delta_log/
   ├── 00000000000000000000.json   # 최초 커밋
   ├── 00000000000000000001.json   #  번째 커밋
   ├── 00000000000000000002.json   #  번째 커밋
   ├── ...
   └── 00000000000000000010.checkpoint.parquet  # 10번째에 체크포인트
├── part-00000-xxx.parquet          # 실제 데이터 파일
├── part-00001-xxx.parquet
└── ...

커밋 로그 (JSON)

각 JSON 파일은 하나의 트랜잭션(커밋)을 나타낸다.

{
  "add": {
    "path": "part-00000-xxx.parquet",
    "size": 1024000,
    "partitionValues": {"date": "2026-03-05"},
    "modificationTime": 1709654400000,
    "dataChange": true,
    "stats": "{\"numRecords\":10000,\"minValues\":{\"amount\":0},\"maxValues\":{\"amount\":99999}}"
  }
}

주요 액션 타입:

  • add: 새 파일 추가
  • remove: 파일 논리적 삭제
  • metaData: 스키마/파티션 변경
  • txn: 애플리케이션 트랜잭션 ID (멱등성)
  • protocol: 읽기/쓰기 프로토콜 버전

체크포인트 (Parquet)

10번째 커밋마다 체크포인트 파일을 생성한다.

  • 그 시점까지의 모든 액션을 하나의 Parquet 파일로 압축
  • 읽기 시 체크포인트부터 시작하면 되므로 성능 향상
  • 수천 개의 JSON 파일을 일일이 읽지 않아도 됨

ACID 보장 메커니즘

  • 읽기: 체크포인트 + 이후 JSON 파일들을 리플레이하여 일관된 스냅샷 생성
  • 쓰기: 새 로그 엔트리를 원자적으로 추가 (클라우드 스토리지의 put-if-absent 또는 rename 활용)
  • 동시 쓰기: Optimistic Concurrency Control — 충돌 시 재시도

핵심 기능

Change Data Feed (CDF)

테이블의 행 단위 변경 사항을 추적한다. CDC(Change Data Capture)를 스토리지 계층에서 네이티브로 지원.

-- CDF 활성화
ALTER TABLE orders SET TBLPROPERTIES ('delta.enableChangeDataFeed' = 'true');

-- 변경 데이터 읽기
SELECT * FROM table_changes('orders', 2, 5);
-- startVersion=2, endVersion=5 사이의 변경 사항

반환되는 추가 컬럼:

  • _change_type: insert, update_preimage, update_postimage, delete
  • _commit_version: 변경이 발생한 커밋 버전
  • _commit_timestamp: 커밋 시각

활용:

  • 다운스트림 테이블 증분 업데이트
  • 실시간 동기화 파이프라인
  • 감사 로그

UniForm (Universal Format)

Delta 테이블을 Iceberg 또는 Hudi로도 읽을 수 있게 하는 호환성 레이어이다.

ALTER TABLE orders SET TBLPROPERTIES (
  'delta.universalFormat.enabledFormats' = 'iceberg'
);
  • Delta가 커밋할 때 Iceberg 메타데이터도 함께 생성
  • Iceberg를 지원하는 엔진(Trino, Snowflake 등)에서 같은 데이터를 읽을 수 있음
  • 데이터 복사 없이 포맷 호환성 확보
  • Delta의 멀티 엔진 전략

스키마 진화

-- 자동 스키마 병합 (쓰기 )
spark.conf.set("spark.databricks.delta.schema.autoMerge.enabled", "true")

-- 수동 스키마 변경
ALTER TABLE orders ADD COLUMNS (category STRING, discount DOUBLE);

두 가지 모드:

  • Schema Enforcement: 스키마와 맞지 않는 데이터는 쓰기 거부
  • Schema Evolution: 새 컬럼이 감지되면 스키마를 자동 확장

타임 트래블

-- 버전으로 조회
SELECT * FROM orders VERSION AS OF 5;

-- 타임스탬프로 조회
SELECT * FROM orders TIMESTAMP AS OF '2026-03-01';

-- 히스토리 확인
DESCRIBE HISTORY orders;

Z-ORDER 최적화

자주 쿼리하는 컬럼 기준으로 데이터를 물리적으로 재배치하여 파일 스킵 효율을 높인다.

OPTIMIZE orders ZORDER BY (user_id, created_at);

Iceberg와의 차이점

항목Delta LakeApache Iceberg
메타데이터 저장Transaction Log (JSON + Parquet)계층적 매니페스트 (Avro)
동시성 제어Optimistic ConcurrencyOptimistic Concurrency
파티셔닝명시적 (Hive 스타일)Hidden Partitioning (자동)
엔진 호환Spark 최적, UniForm으로 확장네이티브 멀티 엔진
CDCChange Data Feed (네이티브)별도 구현 필요
파일 스킵Data Skipping + Z-ORDER컬럼 통계 + 매니페스트 프루닝
대규모 테이블체크포인트로 관리매니페스트 재사용으로 최적화

주요 채택 사례

  • Databricks: Delta Lake의 기본 포맷
  • Microsoft Fabric: OneLake의 기본 테이블 포맷
  • T-Mobile, Comcast, Shell: 대규모 프로덕션 사용
  • Azure Synapse Analytics: 네이티브 Delta 지원

관련 개념

참고 자료