Apache Iceberg는 Netflix와 Apple이 개발한 오픈 테이블 포맷으로, 페타바이트 규모의 분석 테이블을 위한 고성능 포맷이다. 2020년 Apache 최상위 프로젝트로 승격되었으며 클라우드 중립적 레이크하우스의 표준으로 자리잡고 있다.
핵심 아이디어
전통적 Hive 메타스토어: 파티션 디렉토리 목록 → 느린 플래닝
Iceberg: 파일 수준 메타데이터 스냅샷 → 빠른 플래닝
Iceberg 계층:
카탈로그 → 메타데이터 파일(snapshot) → 매니페스트 리스트
→ 매니페스트 파일 → 데이터 파일(Parquet/ORC/Avro)
주요 기능
| 기능 | 설명 |
|---|
| 스냅샷 격리 | 스냅샷 기반 ACID, 동시성 안전 |
| 히든 파티셔닝 | 사용자가 파티션 키 명시 불필요 |
| 스키마 진화 | 하위 호환 가능한 스키마 변경 |
| 파티션 진화 | 데이터 재작성 없이 파티셔닝 변경 |
| Time Travel | 과거 스냅샷 조회 |
| Row-level Delete | 특정 행 논리적 삭제 |
PyIceberg 사용
python
from pyiceberg.catalog import load_catalog
from pyiceberg.schema import Schema
from pyiceberg.types import NestedField, StringType, LongType
catalog = load_catalog("glue", **{"type": "glue", "region_name": "us-east-1"})
# 테이블 생성
schema = Schema(
NestedField(1, "order_id", LongType(), required=True),
NestedField(2, "customer_id", LongType()),
NestedField(3, "status", StringType()),
)
table = catalog.create_table("db.orders", schema=schema)
# 데이터 삽입
import pyarrow as pa
df = pa.table({"order_id": [1,2,3], "customer_id": [100,101,102], "status": ["new","done","new"]})
table.append(df)
# Time Travel
snapshot_id = table.history()[1].snapshot_id
old_table = table.scan(snapshot_id=snapshot_id).to_arrow()
관련 개념