📊 데이터공학

데이터 레이크하우스

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 같은 통합 카탈로그로 데이터 거버넌스와 접근 제어를 관리합니다.

코드 예제

Python (Delta Lake)
# 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!")

실무 대화

Redshift와 S3 레이크 둘 다 유지하고 있는데, 데이터 동기화가 너무 힘들어요.
레이크하우스 아키텍처로 통합을 고려하세요. Delta Lake나 Iceberg를 S3 위에 적용하면 ACID 트랜잭션과 스키마 관리가 가능해져요. Redshift Spectrum이나 Athena로 직접 쿼리하면 데이터 복제 없이 BI와 ML을 통합할 수 있습니다.
Delta Lake와 Apache Iceberg의 차이점은?
둘 다 오픈 테이블 포맷으로 ACID와 타임 트래블을 지원해요. Delta Lake는 Databricks 생태계와 통합이 강하고, Iceberg는 벤더 중립적이며 Snowflake, Trino, Spark 등 다양한 엔진 지원이 우수합니다. Hudi는 스트리밍 Upsert에 특화되어 있어요. 조직 환경에 맞게 선택하면 됩니다.
Delta 테이블인데 VACUUM 없이 1년간 운영했네요. 버전 파일이 엄청 많아요.
VACUUM을 정기 실행해서 오래된 버전 파일을 정리해야 해요. 기본 7일 보존인데, retention을 설정하고 주기적으로 실행하세요. 또한 OPTIMIZE로 소형 파일 병합도 함께 해주세요. S3 비용 절감에 효과적입니다.

주의사항

  • Small Files 문제를 방지하려면 OPTIMIZE/Compaction을 정기적으로 실행해야 합니다.
  • VACUUM 없이 장기 운영하면 메타데이터 파일이 누적되어 성능 저하와 비용 증가가 발생합니다.
  • Delta, Iceberg, Hudi 간 호환성이 완벽하지 않으므로 포맷 선정 시 신중히 검토하세요.
  • 타임 트래블 활용 시 오래된 버전 데이터가 삭제될 수 있으니 VACUUM retention 설정을 확인하세요.
  • Unity Catalog나 AWS Lake Formation으로 테이블 수준 접근 제어를 설정하면 거버넌스와 보안을 강화할 수 있습니다.

더 배우기