본문 바로가기
● Data Insights/System

Databricks 기술 가이드: Delta Lake, Apache Spark, 그리고 최신 플랫폼 기능

by DATA Canvas 2025. 11. 27.
반응형

데이터 엔지니어링과 분석의 세계에서 Databricks는 단순한 클라우드 플랫폼을 넘어 데이터 레이크하우스 아키텍처의 표준으로 자리잡았습니다. Apache Spark의 창시자들이 설립한 Databricks는 빅데이터 처리의 복잡함을 해결하고, 데이터 웨어하우스와 데이터 레이크의 장점을 하나로 통합한 혁신적인 솔루션을 제공합니다. 이번 글에서는 Databricks를 구성하는 핵심 기술들을 하나씩 살펴보고, 실제 업무에서 어떻게 활용할 수 있는지 알아보겠습니다.

 

 


Delta Lake: 신뢰할 수 있는 데이터 저장소의 핵심

Delta Lake는 Databricks 레이크하우스 플랫폼의 최적화된 저장 계층으로, 오픈소스 프로젝트이자 데이터 레이크의 신뢰성을 획기적으로 높인 혁신입니다. Apache Parquet 위에 구축되어 컬럼 기반 저장 형식의 장점을 그대로 가져가면서도, ACID 트랜잭션과 스키마 관리 같은 데이터 웨어하우스의 핵심 기능을 데이터 레이크에 적용했습니다.

Delta Lake의 핵심 기능

ACID 트랜잭션 지원

Delta Lake는 동시에 여러 사용자가 하나의 테이블을 수정할 수 있도록 Optimistic Concurrency Control을 구현했습니다. 이를 통해 데이터 무결성을 보장하면서도 높은 처리량을 유지할 수 있습니다. 기존 데이터 레이크에서 흔히 발생하던 부분 쓰기 실패나 읽기 중 데이터 변경 같은 문제들을 근본적으로 해결했습니다.

 

트랜잭션 로그와 타임 트래블

Delta Lake의 가장 독특한 특징은 _delta_log 디렉토리에 저장되는 트랜잭션 로그입니다. 모든 데이터 변경 작업(삽입, 수정, 삭제)은 JSON 형식의 커밋으로 기록되며, 이 로그가 데이터의 단일 진실 공급원(Single Source of Truth)으로 작동합니다.

이 트랜잭션 로그 덕분에 타임 트래블 기능을 사용할 수 있습니다. 특정 버전이나 시점의 데이터 상태를 조회하거나 복원하는 것이 가능해져, 데이터 감사, 디버깅, 롤백 작업이 매우 간단해졌습니다.

-- 버전 기반 타임 트래블
SELECT * FROM delta_table VERSION AS OF 5;

-- 타임스탬프 기반 타임 트래블
SELECT * FROM delta_table TIMESTAMP AS OF '2023-10-01';

 

스키마 관리: Enforcement와 Evolution

Delta Lake는 스키마 무결성을 기본으로 보장합니다. 테이블에 정의된 스키마와 맞지 않는 데이터를 저장하려고 하면 쓰기 작업이 거부되어 잘못된 데이터의 유입을 원천 차단합니다. 하지만 동시에 스키마 진화(Schema Evolution) 기능도 제공하여, 필요할 때 테이블 구조를 유연하게 변경할 수 있습니다.

스키마 진화를 활성화하면 새로운 컬럼이 추가되거나 기존 컬럼이 변경될 때 전체 데이터를 재작성하지 않고도 테이블 스키마를 업데이트할 수 있습니다. MERGE 작업에서도 스키마 진화가 적용되어, 소스 데이터에 새 컬럼이 있으면 타겟 테이블에 자동으로 추가됩니다.

Delta Lake와 Parquet 비교

많은 분들이 Delta Lake와 Parquet의 차이를 궁금해하십니다. Parquet는 컬럼 기반 저장 형식으로 압축률과 쿼리 성능이 뛰어나지만, 트랜잭션이나 업데이트 기능이 없습니다. 실제 프로젝트에서 Delta Lake는 쿼리 성능에서 약 30% 빠르고, 업데이트 작업에서는 10배 이상 빠른 것으로 측정되었습니다.

따라서 데이터가 자주 변경되고 트랜잭션이 중요한 경우 Delta Lake를, 한 번 쓰고 변경이 없는 히스토리 데이터라면 Parquet를 선택하는 것이 효율적입니다.

반응형

성능 최적화: OPTIMIZE와 Z-ORDER

Delta Lake는 시간이 지나면서 작은 파일들이 많아지는 문제를 해결하기 위해 OPTIMIZE 명령을 제공합니다. 이 명령은 여러 작은 파일들을 더 큰 파일로 병합하여 쿼리 성능을 크게 향상시킵니다.

Z-ORDER는 데이터를 다차원으로 정렬하여 쿼리 시 스캔해야 하는 파일 수를 획기적으로 줄이는 기술입니다. 특정 컬럼으로 자주 필터링하는 쿼리가 있다면, Z-ORDER를 적용하면 파일 스킵 효율이 극대화됩니다.

-- 파일 압축
OPTIMIZE delta_table;

-- Z-ORDER 적용
OPTIMIZE delta_table ZORDER BY (customer_id, order_date);

CDC와 MERGE를 활용한 데이터 동기화

Delta Lake의 MERGE 명령은 UPSERT(Update + Insert) 작업을 간단하게 구현할 수 있게 해줍니다. 이는 변경 데이터 캡처(CDC)와 천천히 변하는 차원(SCD) 패턴 구현에 매우 유용합니다.

MERGE INTO target_table AS t
USING source_table AS s
ON t.id = s.id
WHEN MATCHED THEN 
  UPDATE SET t.value = s.value, t.updated_at = s.updated_at
WHEN NOT MATCHED THEN
  INSERT (id, value, updated_at) VALUES (s.id, s.value, s.updated_at);

최신 Databricks에서는 Lakeflow 파이프라인과 함께 AUTO CDC ... INTO 구문을 사용하면 순서가 뒤바뀐 레코드도 자동으로 처리할 수 있습니다.


Apache Spark: 분산 데이터 처리의 중심

Apache Spark는 Databricks의 핵심 엔진으로, 대규모 데이터를 빠르게 처리할 수 있는 분산 컴퓨팅 프레임워크입니다. Spark는 메모리 기반 처리와 지연 평가(Lazy Evaluation) 같은 최적화 기법을 통해 기존 MapReduce 대비 최대 100배 빠른 성능을 제공합니다.

Spark의 데이터 추상화: RDD, DataFrame, Dataset

Spark는 세 가지 주요 데이터 API를 제공합니다.

 

RDD (Resilient Distributed Dataset)

RDD는 Spark의 가장 기본적인 데이터 구조로, 불변성과 분산 처리를 특징으로 합니다. 저수준 API로 세밀한 제어가 가능하지만, 코드 복잡도가 높고 Spark SQL 최적화를 활용할 수 없습니다.

 

DataFrame

DataFrame은 테이블 형태의 구조화된 데이터를 다루는 고수준 API입니다. Spark SQL과 완벽하게 통합되어 SQL 쿼리를 그대로 사용할 수 있으며, Catalyst 옵티마이저의 최적화를 받을 수 있습니다. 다만 컴파일 타임 타입 안정성이 없어 런타임 오류가 발생할 수 있습니다.

 

Dataset

Dataset은 DataFrame의 편의성과 RDD의 타입 안정성을 결합한 API입니다. 컴파일 시점에 타입 검사가 이루어져 더 안전한 코드 작성이 가능하지만, 현재는 Scala와 Java에서만 지원됩니다. Python이나 R에서는 DataFrame을 사용하게 됩니다.

Spark의 핵심 개념: Transformation과 Action

Spark의 연산은 크게 두 가지로 나뉩니다.

Transformation

Transformation은 기존 데이터셋을 새로운 데이터셋으로 변환하는 연산입니다. filter(), select(), groupBy(), join() 같은 연산들이 여기 해당됩니다. 중요한 점은 Transformation은 즉시 실행되지 않고 실행 계획(Lineage)으로만 기록된다는 것입니다.

Action

Action은 실제 계산을 수행하고 결과를 반환하는 연산입니다. show(), count(), collect(), save() 같은 연산이 Action에 해당하며, Action이 호출되어야 비로소 모든 Transformation이 실행됩니다.

Lazy Evaluation의 장점

이러한 지연 평가 방식은 여러 장점을 제공합니다. 전체 데이터 파이프라인을 한 번에 최적화할 수 있어 불필요한 연산을 제거하고, Shuffle 같은 비용이 큰 연산을 최소화할 수 있습니다. 또한 Lineage 정보를 유지하여 장애 발생 시 데이터를 재계산할 수 있는 내구성을 제공합니다.

Catalyst 옵티마이저와 Tungsten 엔진

Spark의 뛰어난 성능은 Catalyst 옵티마이저와 Tungsten 실행 엔진 덕분입니다.

Catalyst 옵티마이저

Catalyst는 SQL 쿼리와 DataFrame 연산을 최적화하는 쿼리 옵티마이저입니다. 논리적 실행 계획을 분석하고, 술어 푸시다운(Predicate Pushdown), 컬럼 프루닝(Column Pruning), 상수 폴딩(Constant Folding) 같은 최적화 기법을 적용하여 가장 효율적인 물리적 실행 계획을 생성합니다.

Tungsten 실행 엔진

Tungsten은 저수준 실행 최적화를 담당합니다. Whole-Stage Code Generation으로 여러 연산을 하나의 함수로 결합하여 가상 함수 호출 오버헤드를 제거하고, Vectorized Execution으로 SIMD 명령어를 활용해 한 번에 여러 행을 처리합니다. 또한 Off-Heap Memory를 사용하여 JVM 가비지 컬렉션 부담을 줄입니다.

이 두 컴포넌트가 함께 작동하여 Spark는 매우 빠른 쿼리 성능을 제공합니다.

Structured Streaming: 실시간 데이터 처리

Structured Streaming은 Spark의 배치 처리 API를 스트리밍 데이터에 그대로 적용할 수 있게 하는 기능입니다. 스트림 데이터를 무한히 추가되는 테이블로 간주하고, 배치 쿼리와 동일한 방식으로 처리할 수 있습니다.

Delta Lake와 결합하면 실시간 데이터 수집, 변환, 분석을 단일 플랫폼에서 처리할 수 있습니다. IoT 센서 데이터, 로그 분석, 실시간 대시보드 같은 사용 사례에 매우 적합합니다.

Spark 클러스터 아키텍처

Spark 클러스터는 Driver와 Executor로 구성됩니다.

Driver

Driver는 Spark 애플리케이션의 중심으로, 전체 작업을 DAG(Directed Acyclic Graph)로 변환하고 작업을 스케줄링합니다. 클러스터 매니저와 통신하여 리소스를 할당받고, Executor들에게 태스크를 분배하며, 진행 상황을 모니터링합니다.

Executor

Executor는 실제 데이터 처리를 수행하는 워커 노드입니다. 각 Executor는 파티션된 데이터의 일부를 메모리에 유지하고, 할당받은 태스크를 실행합니다. 중간 결과를 캐싱하여 반복 연산의 속도를 높이고, Driver에게 작업 상태를 보고합니다.


Photon Engine: 차세대 쿼리 엔진

Photon은 Databricks가 개발한 C++ 기반의 벡터화된 쿼리 엔진으로, 기존 Spark 엔진보다 훨씬 빠른 성능을 제공합니다.

Photon의 핵심 기술

벡터화 실행

Photon은 한 번에 한 행씩 처리하는 대신 컬럼 배치 단위로 데이터를 처리합니다. 이는 CPU 캐시 활용도를 높이고 SIMD 명령어를 통해 동일 연산을 여러 값에 동시 적용할 수 있게 합니다.

하드웨어 최적화

Photon은 AVX-512 같은 최신 CPU 명령어 세트를 활용하도록 설계되었습니다. 네이티브 코드 실행으로 JVM 오버헤드를 제거하고, Delta Lake와 Parquet 같은 컬럼 저장 형식과 긴밀하게 통합되어 디스크 I/O를 최소화합니다.

Photon 성능 벤치마크

TPC-DS 1TB 벤치마크에서 Photon은 표준 엔진 대비 약 2배 빠른 성능을 보였고, 일부 복잡한 조인 작업에서는 최대 20배까지 속도가 향상되었습니다. 실제 고객 워크로드에서는 평균 3-8배의 성능 개선과 함께 30-50%의 비용 절감 효과를 얻었습니다.

특히 대량 조인, 집계, 필터링, 복잡한 윈도우 함수가 포함된 SQL 쿼리에서 Photon의 장점이 두드러집니다. Databricks SQL 웨어하우스에서는 Photon이 기본 엔진으로 적용되며, Job 클러스터에서는 별도로 활성화할 수 있습니다.


Unity Catalog: 통합 데이터 거버넌스

Unity Catalog은 Databricks 전체 데이터 자산을 중앙에서 관리하는 통합 거버넌스 솔루션입니다.

Unity Catalog의 구조

Metastore

Metastore는 Unity Catalog의 최상위 컨테이너로, 테이블, 뷰, 볼륨 같은 보안 객체의 메타데이터를 등록합니다. 각 리전마다 하나의 Metastore를 구성하고, 여러 워크스페이스가 이를 공유할 수 있습니다.

3단계 네임스페이스

Unity Catalog은 catalog.schema.table 형식의 3단계 네임스페이스를 제공합니다. 이를 통해 데이터를 논리적으로 구조화하고, 세밀한 수준(Catalog, Schema, Table, Column)의 접근 제어가 가능합니다.

데이터 거버넌스 기능

Unity Catalog은 중앙화된 권한 관리로 누가 어떤 데이터에 접근할 수 있는지 세밀하게 제어할 수 있습니다. 데이터 계보(Data Lineage) 추적으로 데이터의 흐름을 시각화하고, Amazon S3나 Azure Blob Storage 같은 기존 저장소와의 통합을 지원합니다.

MLflow와도 긴밀하게 통합되어 ML 모델과 아티팩트를 Unity Catalog에서 중앙 관리할 수 있습니다.


Databricks 클러스터 유형

Databricks는 사용 목적에 따라 여러 클러스터 유형을 제공합니다.

All-Purpose(Interactive) 클러스터

대화형 분석과 협업을 위한 클러스터로, 여러 사용자가 동시에 접속하여 데이터 탐색, 모델 개발 등을 수행할 수 있습니다. 사용하지 않을 때는 수동으로 종료해야 하며, 유연성은 높지만 비용이 상대적으로 높습니다.

Job 클러스터

특정 작업을 실행하기 위해 필요 시점에 자동으로 생성되고, 작업 완료 후 자동 종료되는 클러스터입니다. 데이터 파이프라인, 예약된 배치 작업, 리포트 생성에 적합하며, All-Purpose 클러스터보다 비용 효율적입니다.

Serverless 클러스터

인프라 구성 없이 작업을 실행할 수 있는 완전 관리형 옵션입니다. Databricks가 리소스를 자동으로 최적화하고 스케일링하며, Photon과 Auto Scaling이 기본 활성화됩니다. Unity Catalog이 활성화된 워크스페이스에서 사용할 수 있으며, 클러스터 생성 권한 없이도 모든 사용자가 사용 가능합니다.


Medallion 아키텍처: 데이터 레이크하우스의 표준 패턴

Medallion 아키텍처는 Databricks에서 권장하는 데이터 구성 방식으로, Bronze-Silver-Gold 3단계로 데이터를 조직화합니다.

Bronze 레이어

원천 시스템에서 수집한 원본 데이터를 있는 그대로 저장하는 불변의 진실 공급원입니다. RDBMS, JSON 파일, IoT 데이터 등 다양한 소스의 데이터를 그대로 적재합니다. 스키마 정의가 필수는 아니며, 변경 이력을 보존합니다.

Silver 레이어

Bronze 데이터를 정제하고 변환한 결과를 저장합니다. 중복 제거, 데이터 타입 변환, 조인, 필터링 등의 작업이 수행되며, 스키마가 명확하게 정의됩니다. SCD Type 2 같은 히스토리 관리가 일반적으로 여기서 이루어집니다.

Gold 레이어

비즈니스 레벨의 집계와 인사이트를 제공하는 최종 데이터셋입니다. 대시보드, 리포팅, ML 모델 학습에 바로 사용할 수 있는 형태로 가공됩니다. 비정규화되고 최적화된 구조로 쿼리 성능이 극대화됩니다.

이 아키텍처는 데이터 품질을 단계적으로 향상시키고, 책임 소재를 명확히 하며, 비용 효율성을 높이는 장점이 있습니다.


Auto Loader: 스트리밍 데이터 수집 자동화

Auto Loader는 클라우드 스토리지에 도착하는 새 파일을 자동으로 감지하고 처리하는 기능입니다. CloudFiles라는 Structured Streaming 소스를 통해 새 파일이 도착할 때마다 증분 처리를 수행합니다.

Auto Loader의 핵심 기능

메타데이터 추적

처리된 파일 정보를 RocksDB 기반 체크포인트에 저장하여 중복 처리를 방지합니다. 정확히 한 번(Exactly-Once) 처리를 보장하여 데이터 무결성을 유지합니다.

스키마 자동 추론 및 진화

Auto Loader는 파일에서 스키마를 자동으로 추론하고, 스키마 변경 시 자동으로 대응할 수 있습니다. Delta Live Tables와 결합하면 체크포인트나 스키마를 수동으로 관리할 필요 없이 몇 줄의 코드로 프로덕션급 파이프라인을 구축할 수 있습니다.[

# Auto Loader 스트리밍 예시
spark.readStream \
  .format("cloudFiles") \
  .option("cloudFiles.format", "json") \
  .load("/input/path") \
  .writeStream \
  .format("delta") \
  .option("checkpointLocation", "/checkpoint/path") \
  .start("/output/delta-table")

MLflow: ML 라이프사이클 관리

MLflow는 머신러닝 모델 개발부터 배포까지 전체 라이프사이클을 관리하는 오픈소스 플랫폼입니다.

MLflow의 주요 기능

실험 추적

파라미터, 메트릭, 코드 버전, 모델 아티팩트를 자동으로 추적하여 여러 실험을 비교하고 최적 모델을 선택할 수 있습니다. Databricks 노트북과 완벽하게 통합되어 실험 결과를 안전하게 공유할 수 있습니다.

모델 레지스트리

Unity Catalog과 통합된 Model Registry는 모델 버전 관리, 스테이지 관리(Staging, Production), 메타데이터 추적을 중앙에서 수행합니다. 모델 계보를 추적하고 거버넌스를 강화할 수 있습니다.

모델 배포

MLflow는 REST API 엔드포인트로 모델을 쉽게 배포할 수 있게 합니다. Mosaic AI Model Serving과 결합하면 자동 스케일링, 모니터링, A/B 테스트 등 프로덕션 환경에 필요한 모든 기능을 제공합니다.

GenAI 지원

MLflow 3는 LangChain, Hugging Face, OpenAI와의 통합을 통해 생성형 AI 애플리케이션 개발을 지원합니다. 에이전트 추적(Tracing)으로 각 단계의 실행 정보를 상세히 기록하고, Agent Evaluation으로 품질을 평가할 수 있습니다.


Databricks 레이크하우스: 통합 플랫폼의 장점

Databricks 레이크하우스는 데이터 레이크와 데이터 웨어하우스의 장점을 결합한 통합 아키텍처입니다.

레이크하우스의 핵심 가치

단일 플랫폼에서 모든 데이터 처리

구조화, 반구조화, 비구조화 데이터를 한 곳에서 관리하고, BI, 데이터 엔지니어링, ML/AI 워크로드를 동일 플랫폼에서 실행할 수 있습니다. 데이터를 복제하거나 이동할 필요 없이 여러 용도로 활용할 수 있습니다.

실시간과 배치 처리 통합

스트리밍 데이터와 배치 데이터를 동일한 테이블에서 처리하고, 실시간 분석과 ML 모델 훈련을 병행할 수 있습니다. Lambda 아키텍처 같은 복잡한 이중 처리 파이프라인이 필요 없습니다.

거버넌스와 품질 관리

Unity Catalog을 통한 중앙화된 접근 제어, Delta Lake의 ACID 트랜잭션과 데이터 품질 체크, 완벽한 데이터 계보 추적이 가능합니다. 이를 통해 규제 요구사항을 충족하고 데이터 신뢰성을 보장합니다.


실무 활용 시나리오

실시간 고객 360도 분석

Delta Lake를 사용해 고객 프로필 데이터를 관리하고, 빈번한 업데이트가 발생하는 경우 MERGE 명령으로 효율적인 UPSERT를 수행합니다. 반면 변경이 없는 거래 로그는 Parquet로 저장하여 저장 공간을 최적화합니다.

대규모 ETL 파이프라인

Auto Loader로 클라우드 스토리지의 파일을 자동 수집하고, Medallion 아키텍처로 Bronze-Silver-Gold 단계를 구성합니다. Delta Live Tables로 선언적 파이프라인을 작성하고, 데이터 품질 체크를 적용하며, Lakeflow Jobs로 전체 워크플로를 오케스트레이션합니다.

ML 모델 개발 및 배포

노트북에서 협업하며 모델을 개발하고, MLflow로 실험을 추적합니다. Unity Catalog의 Feature Store로 피처를 중앙 관리하고, Model Registry에 모델을 등록하여 버전 관리합니다. Mosaic AI Model Serving으로 프로덕션 배포 후 자동 모니터링합니다.


성능 최적화 팁

파티셔닝과 버켓팅

카디널리티가 낮은 컬럼(날짜, 지역 등)으로 파티셔닝하여 파일 시스템 레벨에서 데이터를 분리합니다. 카디널리티가 높은 컬럼은 버켓팅을 사용하여 동일 키 값을 같은 파일에 그룹화하고, 조인 성능을 향상시킵니다.

# 파티셔닝
df.write.partitionBy("year", "month").format("delta").save("/path")

# 버켓팅
df.write.bucketBy(100, "user_id").format("delta").saveAsTable("users")

Z-ORDER와 OPTIMIZE

자주 필터링하는 컬럼에 Z-ORDER를 적용하여 파일 스킵 효율을 극대화합니다. 정기적으로 OPTIMIZE를 실행하여 작은 파일 문제를 해결하고, VACUUM으로 오래된 파일을 정리하여 저장 공간을 회수합니다.

Photon 활성화

복잡한 조인, 집계, 윈도우 함수가 많은 SQL 워크로드에서는 Photon을 활성화하여 성능을 2-8배 향상시킵니다. 특히 대규모 데이터셋에서 비용 대비 성능 이득이 큽니다.


Databricks는 Delta Lake의 신뢰성, Apache Spark의 강력한 처리 능력, Photon의 탁월한 성능, Unity Catalog의 통합 거버넌스를 하나로 결합하여 현대적인 데이터 플랫폼을 구현합니다. 이러한 기술들은 각각 독립적으로도 강력하지만, 함께 작동할 때 진정한 시너지를 발휘합니다.

 

Azure 환경에서 SAP, MSSQL 같은 엔터프라이즈 시스템과 통합하고, Power BI로 분석 결과를 시각화하는 작업을 하시는 분들에게 Databricks는 데이터 레이크하우스 구축의 가장 효과적인 선택지가 될 것입니다. Medallion 아키텍처로 데이터 파이프라인을 설계하고, Delta Lake로 신뢰할 수 있는 저장소를 구축하며, Unity Catalog로 거버넌스를 강화하는 방식으로 엔터프라이즈급 분석 플랫폼을 완성할 수 있습니다.

 

각 기술의 특성을 이해하고 적재적소에 활용한다면, 데이터 엔지니어링과 분석 업무의 효율성과 품질을 크게 향상시킬 수 있을 것입니다.

반응형