📊
데이터공학
데이터 레이크하우스
Data Lakehouse
데이터 레이크와 웨어하우스 결합. ACID + 비정형 데이터.
Data Lakehouse
데이터 레이크와 웨어하우스 결합. ACID + 비정형 데이터.
데이터 레이크하우스(Data Lakehouse)는 데이터 레이크의 유연성과 저비용 스토리지, 데이터 웨어하우스의 ACID 트랜잭션과 스키마 관리를 결합한 현대적 데이터 아키텍처입니다. Delta Lake, Apache Iceberg, Apache Hudi 같은 오픈 테이블 포맷이 이 패러다임을 가능하게 했습니다.
레이크하우스는 단일 저장소에서 BI 분석, 머신러닝, 실시간 스트리밍을 모두 지원하며, 기존에 레이크와 웨어하우스를 분리 운영할 때 발생하던 데이터 복제 비용과 ETL 복잡성을 크게 줄입니다. 오픈 포맷을 사용하므로 벤더 종속을 피하고 다양한 쿼리 엔진에서 접근할 수 있습니다.
핵심 기능으로는 ACID 트랜잭션(동시 쓰기 충돌 방지), 스키마 진화(컬럼 추가/변경 무중단), 타임 트래블(과거 시점 데이터 조회/롤백), Z-Ordering(쿼리 패턴 최적화된 데이터 레이아웃)이 있습니다.
Databricks, Snowflake, AWS Lake Formation, Google BigLake 등이 레이크하우스 아키텍처를 제공하며, Unity Catalog나 Polaris 같은 통합 카탈로그로 데이터 거버넌스와 접근 제어를 관리합니다.
# Delta Lake 기반 레이크하우스 아키텍처
from delta.tables import DeltaTable
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
spark = SparkSession.builder \
.appName("Lakehouse") \
.config("spark.sql.extensions",
"io.delta.sql.DeltaSparkSessionExtension") \
.config("spark.sql.catalog.spark_catalog",
"org.apache.spark.sql.delta.catalog.DeltaCatalog") \
.getOrCreate()
# 1. ACID 트랜잭션으로 데이터 저장
orders_df = spark.read.json("s3://raw/orders/")
orders_df.write \
.format("delta") \
.mode("overwrite") \
.partitionBy("order_date") \
.save("s3://lakehouse/bronze/orders/")
# 2. 스키마 진화 - 새 컬럼 추가 (무중단)
spark.sql("""
ALTER TABLE delta.`s3://lakehouse/bronze/orders/`
ADD COLUMNS (loyalty_points INT)
""")
# 3. Merge (Upsert) 작업 - CDC 처리
delta_orders = DeltaTable.forPath(spark, "s3://lakehouse/bronze/orders/")
updates_df = spark.read.json("s3://raw/orders_updates/")
delta_orders.alias("target").merge(
updates_df.alias("source"),
"target.order_id = source.order_id"
).whenMatchedUpdate(set={
"status": "source.status",
"updated_at": "source.updated_at"
}).whenNotMatchedInsertAll().execute()
# 4. 타임 트래블 - 과거 시점 조회
historical = spark.read.format("delta") \
.option("versionAsOf", 5) \
.load("s3://lakehouse/bronze/orders/")
# 5. Z-Ordering으로 쿼리 최적화
spark.sql("""
OPTIMIZE delta.`s3://lakehouse/gold/orders/`
ZORDER BY (customer_id, order_date)
""")
print("Lakehouse operations completed!")