레이크하우스(Lakehouse)는 데이터 레이크의 저비용 스토리지와 데이터 웨어하우스의 ACID 트랜잭션·성능을 결합한 아키텍처 패턴이다. Delta Lake, Apache Iceberg, Apache Hudi가 구현체다.
아키텍처 진화
Data Warehouse (고비용, 정형 데이터만)
↓
Data Lake (저비용, 비정형 지원, 품질 부족)
↓
Lakehouse (저비용 + ACID + 스키마 + 성능)
테이블 포맷 비교
| 항목 | Delta Lake | Apache Iceberg | Apache Hudi |
|---|
| ACID | 지원 | 지원 | 지원 |
| Time Travel | 지원 | 지원 | 지원 |
| Schema Evolution | 지원 | 강력 | 지원 |
| 주요 사용처 | Databricks | Netflix, AWS | Uber, Hive |
| 엔진 호환 | Spark, Flink | Spark, Flink, Trino | Spark, Flink |
Apache Iceberg 예시
sql
-- Spark SQL로 Iceberg 테이블 생성
CREATE TABLE catalog.db.orders (
order_id BIGINT,
customer_id BIGINT,
amount DECIMAL(12,2),
created_at TIMESTAMP
)
USING iceberg
PARTITIONED BY (days(created_at))
TBLPROPERTIES (
'write.format.default' = 'parquet',
'history.expire.max-snapshot-age-ms' = '604800000' -- 7일
);
-- Time Travel
SELECT * FROM catalog.db.orders
FOR SYSTEM_TIME AS OF TIMESTAMP '2024-01-01 00:00:00';
-- 스키마 진화 (하위 호환)
ALTER TABLE catalog.db.orders ADD COLUMN discount DECIMAL(5,2);
레이크하우스 계층 구조
Bronze (원시): 원본 데이터 그대로 적재
↓ 정제/검증
Silver (정제): 클렌징, 정규화, 중복 제거
↓ 집계/비즈니스 로직
Gold (집계): 분석/서빙 최적화 데이터 마트
성능 최적화
python
# Delta Lake Z-Ordering (다차원 클러스터링)
from delta.tables import DeltaTable
dt = DeltaTable.forPath(spark, "s3://lakehouse/orders/")
dt.optimize().executeZOrderBy("customer_id", "created_at")
# 소파일 압축
dt.optimize().executeCompaction()
# 데이터 스킵핑
spark.sql("""
SELECT * FROM delta.`s3://lakehouse/orders/`
WHERE customer_id = 12345 -- Z-Order로 빠른 스킵핑
""")