📊 데이터공학

Databricks

Databricks

통합 데이터 분석 플랫폼. Spark 창시자 설립.

📖 상세 설명

Databricks는 Apache Spark 창시자들이 설립한 통합 데이터 분석 플랫폼입니다. 데이터 엔지니어링, 데이터 과학, 머신러닝, 비즈니스 분석을 하나의 플랫폼에서 수행할 수 있으며, "데이터 레이크하우스" 아키텍처를 선도하고 있습니다.

핵심 구성요소는 Unity Catalog, Delta Lake, MLflow입니다. Unity Catalog는 메타데이터 관리와 데이터 거버넌스를 담당합니다. 테이블, 뷰, 함수에 대한 접근 권한을 세밀하게 제어하고, 데이터 리니지(lineage)를 추적합니다. 여러 워크스페이스에서 동일한 데이터에 접근하면서도 보안을 유지할 수 있습니다.

Delta Lake는 데이터 레이크에 ACID 트랜잭션, 스키마 진화, Time Travel 기능을 제공합니다. Databricks는 Delta Lake와 긴밀히 통합되어 있어 별도 설정 없이 이러한 기능을 활용할 수 있습니다. 특히 Delta Live Tables를 통해 선언적으로 데이터 파이프라인을 정의할 수 있습니다.

Databricks Workflows는 작업 스케줄링과 오케스트레이션을 담당합니다. 노트북, Python 스크립트, JAR 파일 등을 DAG 형태로 연결하여 복잡한 데이터 파이프라인을 구축합니다. 자동 클러스터 관리로 비용을 최적화하고, 실패 시 자동 재시도 및 알림을 제공합니다.

💻 코드 예제

# Databricks 노트북 예제: Delta Lake + Unity Catalog 활용

# 1. Unity Catalog에서 카탈로그/스키마 설정
spark.sql("USE CATALOG main")
spark.sql("USE SCHEMA sales_analytics")

# 2. Delta Lake 테이블 생성 (Unity Catalog 관리)
spark.sql("""
CREATE TABLE IF NOT EXISTS bronze_orders (
    order_id STRING,
    customer_id STRING,
    product_id STRING,
    quantity INT,
    price DECIMAL(10, 2),
    order_date TIMESTAMP,
    _ingest_timestamp TIMESTAMP
)
USING DELTA
PARTITIONED BY (DATE(order_date))
TBLPROPERTIES (
    'delta.autoOptimize.optimizeWrite' = 'true',
    'delta.autoOptimize.autoCompact' = 'true'
)
""")

# 3. Auto Loader로 S3/ADLS에서 데이터 스트리밍 수집
raw_orders = (spark.readStream
    .format("cloudFiles")
    .option("cloudFiles.format", "json")
    .option("cloudFiles.schemaLocation", "/checkpoints/orders_schema")
    .load("s3://data-lake/raw/orders/"))

# 변환 및 Bronze 테이블에 저장
from pyspark.sql.functions import current_timestamp

bronze_stream = (raw_orders
    .withColumn("_ingest_timestamp", current_timestamp())
    .writeStream
    .format("delta")
    .outputMode("append")
    .option("checkpointLocation", "/checkpoints/bronze_orders")
    .trigger(availableNow=True)
    .toTable("bronze_orders"))

# 4. Delta Lake Time Travel - 과거 버전 조회
# 특정 버전으로 조회
df_v5 = spark.read.format("delta").option("versionAsOf", 5).table("bronze_orders")

# 특정 시점으로 조회
df_yesterday = spark.read.format("delta").option("timestampAsOf", "2024-01-15").table("bronze_orders")

# 5. Unity Catalog - 테이블 권한 관리
spark.sql("GRANT SELECT ON TABLE bronze_orders TO `data-analysts@company.com`")
spark.sql("GRANT MODIFY ON TABLE bronze_orders TO `data-engineers@company.com`")

# 6. 데이터 리니지 확인 (Unity Catalog)
# Databricks UI에서 테이블 -> Lineage 탭에서 시각적으로 확인 가능

print("Delta 테이블 히스토리:")
display(spark.sql("DESCRIBE HISTORY bronze_orders"))

🗣️ 실무에서 이렇게 말해요

데이터엔지니어: "Unity Catalog 도입하면서 기존 Hive Metastore 테이블을 마이그레이션해야 해요. 외부 테이블로 먼저 등록하고 점진적으로 관리형 테이블로 전환할 계획입니다."

주니어: "기존 노트북에서 테이블 참조하는 부분은 어떻게 되나요?"

시니어: "3-level namespace로 바뀌니까 'catalog.schema.table' 형식으로 변경해야 해요. USE CATALOG 설정하면 기존 코드 수정 최소화할 수 있습니다."

면접관: "Databricks에서 비용 최적화 경험이 있으신가요?"

지원자: "Auto-termination 설정으로 유휴 클러스터를 자동 종료하고, Job Cluster 사용으로 Interactive Cluster 비용을 줄였습니다. 또한 Photon 엔진 활성화로 동일 워크로드의 실행 시간을 40% 단축하여 DBU 비용을 절감했어요. Delta Lake OPTIMIZE와 ZORDER도 쿼리 성능 개선에 효과적이었습니다."

리뷰어: "이 노트북에서 display() 대신 show() 쓰고 있는데, Databricks에서는 display()가 더 풍부한 시각화를 제공해요."

작성자: "수정하겠습니다. 그리고 dbutils.notebook.run() 대신 Workflows에서 오케스트레이션하는 게 더 나을까요?"

⚠️ 주의사항

🔥 실제 장애 사례

금융사 사례 2023

Interactive Cluster 상시 운영으로 월 비용 폭발

원인: 개발팀이 테스트용 All-Purpose Cluster를 24시간 상시 실행, auto-termination 미설정

영향: 예상 비용의 5배 청구, 월 $50,000 초과 지출

해결: auto-termination 15분 강제 설정, 프로덕션은 Job Cluster로 전환

교훈: 클러스터 정책으로 비용 제한, 비용 알림 설정, Job Cluster 우선 사용

이커머스 사례 2022

Unity Catalog 미도입으로 데이터 거버넌스 실패

원인: 워크스페이스 간 데이터 중복 저장, 권한 관리 분산, 감사 로그 미통합

영향: GDPR 감사에서 데이터 접근 이력 제출 실패, 과징금 위험

해결: Unity Catalog 긴급 도입, 기존 테이블 마이그레이션

교훈: 멀티팀 환경에서는 초기부터 Unity Catalog 도입, 데이터 리니지 추적 필수

📝 이해도 퀴즈

Q1. Databricks의 "데이터 레이크하우스" 아키텍처의 핵심은?

Q2. Databricks에서 비용을 절감하는 방법이 아닌 것은?

Q3. Unity Catalog의 주요 역할은?

📚 더 배우기

💬 질문 & 기여

이 페이지에 오류가 있거나 추가하고 싶은 내용이 있다면 알려주세요!