데이터 레이크의 고질병인 작은 파일 문제와 데이터 단편화를 Iceberg 자체 관리 기능으로 해결하는 실전 운영 가이드입니다. 쿼리 성능을 10배 끌어올리고 스토리지 비용을 절반으로 줄이는 방법을 단계별로 정리했습니다.
Ⅰ. Apache Iceberg 최적화 기술이란?
단순한 저장 포맷을 넘어, 데이터 레이크의 두 가지 고질적 문제를 자체적으로 해결합니다.
① 작은 파일 문제 : 스트리밍/배치가 생성하는 수천 개의 작은 파일이 쿼리 플래닝 비용을 폭발적으로 키웁니다.
② 데이터 단편화 : 업데이트·삭제가 반복될수록 파일이 단편화되고, 불필요한 메타데이터가 쌓여 성능이 저하됩니다.
Iceberg의 자체 관리 기능은 수천 개의 작은 파일을 하나로 병합하고 불필요한 메타데이터를 정리하여 쿼리 성능을 비약적으로 향상시키는 운영의 핵심입니다. 단순 저장소가 아닌, 스스로 건강을 관리하는 스마트 테이블이라고 이해하면 좋습니다.
Ⅱ. Apache Iceberg 주요 특징
Iceberg 최적화는 네 가지 독립적인 액션으로 구성됩니다. 각각 별개로 실행하거나 파이프라인으로 조합할 수 있습니다.
| 구분 | 설명 |
| 파일 병합(Compaction) | 작은 파일들을 128MB~512MB 크기로 병합하여 I/O 효율과 쿼리 속도를 극대화합니다. |
| 스냅샷 만료(Snapshot Expiration) | Time Travel용으로 쌓인 오래된 스냅샷을 정리하여 스토리지 비용을 절감합니다. |
| 고아 파일 제거 (Orphan File Removal) | 메타데이터에서 참조되지 않는 유령 파일을 찾아 삭제하여 데이터 정합성을 유지합니다. |
| 매니페스트 재작성(Rewrite Manifests) | 메타데이터 구조 자체를 재구성하여 쿼리 플래닝 속도를 높입니다. |
Ⅲ. Apache Iceberg 동작 방식
Iceberg의 최적화 작업은 분석 → 재작성 → 커밋의 3단계로 이루어지며, 전 과정에서 원자성(Atomicity)이 보장됩니다. 실패하더라도 기존 데이터는 완전히 안전합니다.
| 단계 | 설명 |
| 분석 스테이지 (Analyze) | 현재 스냅샷과 매니페스트 파일을 스캔하여 최적화 대상을 식별합니다. 설정한 목표 크기(target-file-size)보다 작은 파일이 후보가 됩니다. |
| 재작성 스테이지 (Rewrite) | 식별된 작은 파일들을 병렬로 읽어 목표 크기의 새로운 데이터 파일로 다시 씁니다. 기존 파일은 이 단계에서 삭제되지 않습니다. |
| 커밋 스테이지 (Commit) | 새 파일 정보를 담은 신규 스냅샷을 생성하고 카탈로그를 원자적으로 업데이트합니다. 이 시점부터 새 파일이 활성화되고 구 파일은 다음 스냅샷 만료 시 제거됩니다. |
원자성 보장 덕분에 컴팩션 도중 쿼리가 들어와도 기존 스냅샷을 그대로 읽습니다. 운영 중 언제든 안전하게 실행할 수 있습니다.
Ⅳ. Apache Iceberg 아키텍처 구성 및 흐름도
Iceberg 유지보수 엔진은 별도 클러스터 없이 Spark 또는 Flink 위에서 작동합니다. 스토리지에서 데이터를 읽고 최적화된 파일로 교체한 뒤, 쿼리 엔진이 더 빠르게 스캔할 수 있도록 합니다.
| Data Lake Storage (S3 / GCS / HDFS) 스트리밍·배치가 생성한 수많은 작은 파일 ↓ Iceberg Maintenance Engine (Spark / Flink) 유지보수 액션 실행 ↓ 1) Rewrite Data Files (Compaction) 2) Expire Snapshots 3) Delete Orphan Files 4) Rewrite Manifests ↓ 최적화된 대형 파일 + 정리된 메타데이터 ↓ Query Engine (Trino / Presto / Athena) Faster Scan — 쿼리 속도 |
Ⅴ. Apache Iceberg 최적화 설치 방법
Iceberg의 최적화 기능은 별도 라이브러리 추가 없이, SparkSession에 Iceberg 확장을 등록하는 것만으로 활성화됩니다.
전제 조건: Apache Spark 3.x 이상, Iceberg JAR 포함 환경 (AWS Glue, EMR, Databricks, 또는 직접 구성)
ⅰ. Spark 세션 확장 등록
| # Spark 실행 시 Iceberg 확장 세션 등록 --conf spark.sql.extensions=\ org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \ --conf spark.sql.catalog.local=\ org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.local.type=hadoop \ --conf spark.sql.catalog.local.warehouse=/tmp/iceberg-warehouse |
ⅱ. Python (PySpark) 환경에서 SparkSession 직접 구성
| from pyspark.sql import SparkSession spark = SparkSession.builder \ .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \ .config("spark.sql.catalog.local", "org.apache.iceberg.spark.SparkCatalog") \ .config("spark.sql.catalog.local.type", "hadoop") \ .config("spark.sql.catalog.local.warehouse", "/tmp/iceberg-warehouse") \ .getOrCreate() |
Ⅵ. Apache Iceberg 사용 방법
ⅰ 파일 병합 (Compaction)
| -- binpack 전략으로 512MB 크기 목표 병합 실행 CALL local.system.rewrite_data_files( table => 'db.web_logs', strategy => 'binpack', options => map( 'target-file-size-bytes', '536870912', -- 512MB 'min-input-files', '5' -- 최소 5개 이상일 때만 실행 ) ); |
ⅱ. 스냅샷 만료 처리
| -- 7일 이전 스냅샷 만료 및 물리 파일 정리 CALL local.system.expire_snapshots( 'db.web_logs', CAST(date_sub(current_date(), 7) AS timestamp) ); |
ⅲ. 고아 파일 삭제 + 매니페스트 재구성
| -- 참조되지 않는 물리 파일 제거 (3일 이상 경과한 파일만 대상) CALL local.system.remove_orphan_files( table => 'db.web_logs', older_than => CAST(date_sub(current_date(), 3) AS timestamp) ); -- 메타데이터 재구성으로 쿼리 플래닝 속도 개선 CALL local.system.rewrite_manifests('db.web_logs'); |
Ⅶ. Apache Iceberg 자주 쓰는 명령어
실무에서 자주 사용하는 Iceberg 유지보수 프로시저를 목적별로 정리했습니다.
| 프로시저 | 목적 및 설명 |
| rewrite_data_files | 작은 파일 병합. 가장 빈번하게 사용하는 핵심 액션으로, strategy(binpack/sort/z-order)를 선택할 수 있습니다. |
| expire_snapshots | 오래된 스냅샷 만료 처리. Time Travel 보존 기간을 설정해 스토리지 비용과 기능 사이 균형을 맞춥니다. |
| remove_orphan_files | 메타데이터에서 참조 끊긴 물리 파일 강제 삭제. 잡 실패나 비정상 종료 후 정리할 때 유용합니다. |
| rewrite_manifests | 매니페스트 파일 재구성으로 쿼리 플래닝 시 파일 목록 탐색 비용을 줄입니다. |
| snapshot_table | 기존 Hive 테이블을 데이터 복사 없이 Iceberg 포맷으로 즉시 변환합니다. 마이그레이션 첫 단계에 활용합니다. |
Ⅷ. Apache Iceberg 활용 방안
Iceberg 최적화가 실무에서 효과를 발휘하는 대표적인 세 가지 시나리오입니다.
ⅰ. 성능
1) 실시간 수집 데이터 최적화
2) Kafka로 초 단위 유입되는 작은 파티션 파일을 주기적 컴팩션으로 병합합니다. 분석 리포트 쿼리 시간을 대폭 단축합니다.
3) 쿼리 속도 최대 10배 향상
ⅱ. 비용
1) 클라우드 스토리지 비용 절감
2) S3·GCS 환경에서 무분별하게 늘어나는 메타데이터와 과거 스냅샷을 자동화 파이프라인으로 정기 정리합니다.
3) 스토리지 비용 30~50% 절감
ⅲ. 거버넌스
1) 데이터 거버넌스 강화
2) 스키마 진화·Time Travel과 최적화 작업을 병행하여 감사 추적과 신뢰성 있는 단일 진실 공급원(SSOT)을 구축합니다.
3) 데이터 정합성 & 감사 대응
'어플리케이션' 카테고리의 다른 글
| 웹 자동화의 표준, Selenium에 대해 알아보겠습니다. (0) | 2026.04.29 |
|---|---|
| 초고속 분산 처리 엔진 Apache Spark에 대해 알아보겠습니다. (0) | 2026.04.28 |
| 실시간 레이크하우스의 핵심 Apache Paimon 에 대해 알아보겠습니다. (0) | 2026.04.24 |
| 브루트 포스(Brute Force, 무차별 대입) 공격 완전 정복 (0) | 2026.03.05 |
| WinDbg (Windows Debugger) 에 대해 알아보겠습니다. (0) | 2026.02.20 |