Spark와 Iceberg/Delta Lake 연동 — 카탈로그 설정과 MERGE INTO
Apache Spark의 Iceberg/Delta Lake 카탈로그 연동 및 비용 기반 옵티마이저(CBO) 공식 문서 종합 (웹 리서치, 2026) — Apache Iceberg 공식 문서(spark-configuration, spark-ddl) + Databricks CBO 문서 + japila.pl Spark SQL Internals Apache Iceberg 공식 문서 Spark Configuration/DDL 가이드
이 모듈을 다 읽으면
- Spark가 Iceberg/Delta 테이블을 인식하려면 어떤 카탈로그 설정이 필요한지 설명할 수 있다
- MERGE INTO가 일반 INSERT/UPDATE와 다르게 무엇을 해결하는지 판단할 수 있다
이 프로젝트의 Iceberg 카테고리에서 다룬 테이블 포맷 내부 구조(스냅샷, 메타데이터 트리 등)를 전제로, Spark가 실제로 그 테이블을 어떻게 인식하고 조작하는지 — 카탈로그 설정과 MERGE INTO 문법 — 를 정리한다. Iceberg 자체의 내부 아키텍처는 iceberg 카테고리를 참고할 것.
카탈로그 설정 — Spark가 Iceberg/Delta 테이블을 '알게' 만들기
Spark는 기본적으로 일반 Parquet/CSV 파일이나 Hive 메타스토어 테이블만 이해한다. Iceberg 테이블을 읽고 쓰려면 spark.sql.catalog.<카탈로그이름> 설정에 org.apache.iceberg.spark.SparkCatalog(또는 Hive/REST 카탈로그 구현체)를 지정해, Spark의 카탈로그 플러그인 시스템에 Iceberg 전용 카탈로그를 등록해야 한다. 여기에 더해 spark.sql.extensions에 IcebergSparkSessionExtensions를 등록해야 MERGE/UPDATE/DELETE 같은 행 단위 SQL 확장 문법이 활성화된다 — 이 확장을 안 걸면 Iceberg 테이블이 보이긴 해도 MERGE INTO 같은 문법을 못 쓴다. Delta Lake는 별도 delta-spark 패키지와 io.delta.sql.DeltaSparkSessionExtension 확장으로 유사한 방식의 등록이 필요하다.
핵심 포인트
- spark.sql.catalog.<이름>에 SparkCatalog(또는 Hive/REST 구현체)를 등록해야 Spark가 Iceberg 테이블을 인식한다
- spark.sql.extensions에 IcebergSparkSessionExtensions를 등록해야 MERGE/UPDATE/DELETE 같은 행 단위 SQL 확장이 활성화된다
- Delta Lake도 유사하게 delta-spark 패키지 + 세션 확장 등록이 필요하다
MERGE INTO — 조건부 upsert를 한 문장으로
MERGE INTO t USING (SELECT * FROM updates) u ON t.id = u.id WHEN MATCHED THEN UPDATE SET ... WHEN NOT MATCHED THEN INSERT * 형태로, '조인 키가 맞으면 갱신, 없으면 삽입'하는 조건부 upsert를 한 문장으로 표현한다. 이게 없다면 애플리케이션 코드에서 먼저 존재 여부를 확인하고 UPDATE/INSERT를 따로 실행해야 하는데, 대용량 배치에서는 이 방식이 비효율적이고 동시성 문제(그 사이에 다른 프로세스가 같은 행을 바꾸면)도 생기기 쉽다. MERGE INTO는 이 판단과 실행을 테이블 포맷(Iceberg/Delta)의 트랜잭션 보장 안에서 원자적으로 처리해준다 — CDC(Change Data Capture) 데이터를 타겟 테이블에 반영하는 전형적인 패턴에 특히 많이 쓰인다.
핵심 포인트
- MERGE INTO = '조인 키가 맞으면 UPDATE, 없으면 INSERT'를 한 문장으로 원자적으로 처리
- CDC 데이터를 타겟 테이블에 반영하는 전형적인 패턴에 널리 쓰인다