- 테이블 포맷의 정의와 목적
- 주요 특징: ACID 트랜잭션, 스냅샷 관리, 스키마 진화 등
Key Points
- Iceberg은 대규모 분석 데이터셋을 관리하기 위한 오픈소스 테이블 포맷으로, SQL 테이블의 신뢰성과 단순성을 제공합니다.
- 주요 특징은 ACID 트랜잭션, 스냅샷 관리, 스키마 진화 등이 포함됩니다.
- 연구에 따르면, Iceberg은 데이터 일관성과 성능 최적화를 보장하며, 여러 데이터 처리 엔진이 동시에 동일한 테이블을 사용할 수 있게 합니다.
Iceberg이란 무엇인가?
Iceberg은 대규모 데이터 레이크에서 분석 데이터를 효율적으로 관리하기 위한 오픈소스 테이블 포맷입니다. Apache 소프트웨어 재단의 프로젝트로, SQL 테이블과 유사한 신뢰성과 단순성을 제공하며, Spark, Trino, Flink, Presto, Hive, Impala 같은 다양한 엔진이 동시에 동일한 테이블을 안전하게 사용할 수 있도록 설계되었습니다.
Iceberg의 주요 목적은 데이터 일관성을 유지하고, 스키마 변경을 지원하며, 대규모 데이터셋의 성능을 최적화하는 것입니다. 이는 특히 분산 파일 시스템이나 객체 스토리지에서 데이터를 처리할 때 유용합니다.
테이블 포맷의 정의와 목적
테이블 포맷은 데이터의 구조와 메타데이터를 정의하는 방식으로, Iceberg은 이를 통해 대규모 데이터셋을 체계적으로 관리합니다.
- 목적: 데이터 레이크에서 데이터를 효율적으로 저장하고, 여러 애플리케이션이 트랜잭션적으로 일관되게 작업할 수 있도록 지원합니다.
- Iceberg은 기존 Hive 테이블의 한계를 극복하기 위해 개발되었으며, 특히 데이터 정확성과 성능 문제를 해결합니다. 예를 들어, Netflix와 같은 기업에서 대규모 데이터 처리에서 사용됩니다.
주요 특징: ACID 트랜잭션, 스냅샷 관리, 스키마 진화 등
Iceberg의 주요 특징은 다음과 같습니다:
- ACID 트랜잭션:
- Atomicity(원자성), Consistency(일관성), Isolation(격리), Durability(지속성)을 보장합니다.
- 낙관적 동시성 제어를 통해 메타데이터 파일을 원자적으로 교체하여 트랜잭션을 관리합니다.
- 예를 들어, 여러 프로세스가 동시에 테이블을 수정해도 데이터 충돌 없이 일관성을 유지합니다.
- 스냅샷 관리:
- 테이블의 각 변경 사항은 새로운 스냅샷을 생성하며, 과거 상태를 조회할 수 있는 타임 트래블 기능을 제공합니다.
- 버전 롤백을 지원하여 오류가 발생했을 때 이전 상태로 복구 가능합니다.
- 예를 들어, 특정 시점의 데이터를 재현하거나 감사 로그를 확인할 때 유용합니다.
- 스키마 진화:
- 컬럼 추가, 삭제, 이름 변경, 타입 변경(예: int → long)을 지원하며, 데이터 손실 없이 스키마를 진화시킬 수 있습니다.
- 필드 ID를 사용하여 스키마 변경 시 기존 데이터를 매핑하여 유지합니다.
- 예를 들어, 새로운 컬럼을 추가하더라도 기존 쿼리는 영향을 받지 않습니다.
이 외에도 Iceberg은 내부 파티셔닝과 데이터 압축을 통해 쿼리 성능을 최적화하며, Parquet, Avro, ORC 같은 다양한 파일 포맷을 지원합니다. 이는 예상치 못한 이점으로, 사용자가 특정 파일 포맷에 종속되지 않고 유연하게 작업할 수 있습니다.
Survey Note: Detailed Analysis of Iceberg Tables
Iceberg은 대규모 데이터 처리 환경에서 사용되는 오픈소스 테이블 포맷으로, Apache 소프트웨어 재단의 프로젝트로 2017년에 시작되었습니다. Netflix에서 Hive 테이블의 한계를 해결하기 위해 개발되었으며, 2020년 5월에 Apache 상위 프로젝트로 승격되었습니다. 현재 Airbnb, Apple, Expedia, LinkedIn 등 여러 기업에서 사용되며, 데이터 레이크 관리의 산업 표준으로 자리 잡고 있습니다.
Iceberg의 정의와 배경
Iceberg은 분석용 대규모 테이블을 위한 고성능 포맷으로, SQL 테이블의 신뢰성과 단순성을 빅 데이터 환경에 적용합니다. 이는 분산 파일 시스템(HDFS)이나 객체 스토리지(S3)에서 데이터를 관리하며, 여러 엔진(Spark, Trino, Flink, Presto, Hive, Impala)이 동시에 동일한 테이블을 안전하게 작업할 수 있도록 설계되었습니다.
Iceberg의 개발 배경은 Hive 테이블의 데이터 정확성 문제와 성능 저하를 해결하기 위한 것으로, 특히 트랜잭션 일관성과 스키마 진화를 개선하기 위해 만들어졌습니다. 예를 들어, Hive는 원자적 트랜잭션을 보장하지 않아 데이터 충돌이 발생할 수 있었으나, Iceberg은 이를 해결합니다.
테이블 포맷의 정의와 목적
테이블 포맷은 데이터의 구조와 메타데이터를 정의하는 방식으로, Iceberg은 이를 통해 데이터 레이크에서 대규모 데이터셋을 체계적으로 관리합니다.
- 목적:
- 트랜잭션 일관성을 보장하여 여러 애플리케이션이 동시에 데이터를 수정할 수 있도록 합니다.
- 스키마 진화를 지원하여 테이블 구조를 유연하게 변경 가능하게 합니다.
- 쿼리 성능을 최적화하여 대규모 데이터 처리의 효율성을 높입니다. Iceberg은 데이터 레이크의 데이터를 SQL 테이블처럼 다룰 수 있게 하여, 데이터 엔지니어가 대규모 데이터셋을 빠르고 신뢰할 수 있게 관리할 수 있도록 돕습니다. 예를 들어, AWS, Google Cloud, Snowflake와 같은 클라우드 환경에서 널리 사용됩니다.
주요 특징: 상세 분석
1. ACID 트랜잭션
Iceberg은 ACID 트랜잭션을 지원하여 데이터 일관성과 무결성을 보장합니다.
- Atomicity(원자성): 모든 트랜잭션이 성공하거나 실패해야 하며, 부분적으로 적용되지 않습니다.
- Consistency(일관성): 트랜잭션 후 테이블은 항상 일관된 상태를 유지합니다.
- Isolation(격리): 트랜잭션은 커밋될 때까지 다른 트랜잭션과 격리되어 충돌 방지합니다.
- Durability(지속성): 커밋된 트랜잭션은 영구적으로 저장됩니다. Iceberg은 낙관적 동시성 제어를 사용하여 메타데이터 파일을 원자적으로 교체하며, 이는 동시 수정 시 충돌을 최소화합니다. 예를 들어, 두 개의 커밋이 동시에 발생하면, 하나만 성공하고 나머지는 재시도됩니다.
- 커밋 충돌 해결: 추가 작업은 항상 재시도가 가능하며, 교체 작업은 삭제된 파일이 여전히 존재하는지 확인해야 합니다. 스키마 변경은 기본 버전 이후 변경이 없음을 검증합니다.
- 격리 수준: 직렬화 가능 격리를 지원하여 읽기가 커밋된 스냅샷을 사용하고, 동시 쓰기와 격리됩니다.
2. 스냅샷 관리
스냅샷 관리는 Iceberg의 핵심 기능 중 하나로, 테이블의 각 상태를 버전으로 저장합니다.
- 스냅샷 구조: 각 변경 사항은 새로운 메타데이터 파일을 생성하고, 기존 파일을 원자적으로 교체합니다. 스냅샷은 매니페스트 리스트를 통해 데이터 파일과 삭제 파일을 추적합니다.
- 시퀀스 번호: 모든 성공적인 커밋에 시퀀스 번호가 부여되어 데이터와 삭제 파일의 상대적 나이를 추적합니다. 새 파일은 처음에는 null로 작성되며, 읽기 시 매니페스트의 시퀀스 번호로 대체됩니다.
- 타임 트래블: 특정 스냅샷 ID나 타임스탬프를 사용하여 과거 데이터를 조회할 수 있습니다. 예를 들어, Spark에서 spark.read.format("iceberg").load("bookings.rome_hotels.snapshots").show(truncate = false)로 스냅샷 로그를 확인할 수 있습니다.
- 버전 롤백: table.rollback().toSnapshotId(1588341995546L).commit()처럼 이전 스냅샷으로 복구 가능합니다.
- 보존 정책: min-snapshots-to-keep, max-snapshot-age-ms, max-ref-age-ms로 설정하여 오래된 스냅샷을 정리하며, main 브랜치는 만료되지 않습니다. 버전 3 이상에서는 행 계보(row lineage)를 지원하여 _row_id와 _last_updated_sequence_number를 추적하며, 삭제 벡터(deletion vectors)를 사용하여 효율적인 삭제를 관리합니다.
3. 스키마 진화
스키마 진화는 테이블 구조를 변경할 수 있는 Iceberg의 강력한 기능입니다.
- 지원되는 변경: 컬럼 추가, 삭제, 이름 변경, 재배열, 타입 승격(int → long, float → double 등)을 지원합니다.
- 타입 승격 규칙:Primitive type v1, v2 유효 타입 승격 v3+ 유효 타입 승격 요구 사항
unknown - 모든 타입 - int long long - date - timestamp, timestamp_ns timestamptz로의 승격 불가, 범위 초과 시 런타임 실패 float double double - decimal(P, S) decimal(P', S) if P' > P decimal(P', S) if P' > P 정밀도만 확장 가능 - 기본값 관리: initial-default(추가 전 기록)와 write-default(미제공 시 미래 기록)를 추적하며, 필수 필드에는 반드시 설정해야 합니다.
- 규칙: 필드 추가 시 새 ID 부여, 이름 변경은 ID 유지, 삭제는 현재 스키마에서 제거(복구 불가, nullable이거나 스냅샷 변경 없어야). 구조체 그룹화/해제나 프리미티브에서 구조체로의 진화는 지원되지 않습니다.
- 컬럼 프로젝션: 필드 ID로 선택하며, 누락 시 파티션 메타데이터, 이름 매핑(schema.name-mapping.default), initial-default로 해결, 없으면 null 반환.
4. 파티셔닝과 데이터 압축
Iceberg은 내부적으로 파티셔닝을 관리하여 쿼리 성능을 최적화합니다. 숨겨진 파티셔닝(hidden partitioning)을 통해 사용자가 파티션을 직접 관리할 필요 없이 빠른 쿼리를 보장합니다. 예를 들어, 날짜별 또는 카테고리별로 데이터를 자동으로 분할하여 불필요한 파티션 스캔을 줄입니다.
데이터 압축은 파일 레이아웃과 크기를 최적화하여 읽기 성능을 향상시키며, bin-packing이나 정렬 전략을 사용할 수 있습니다. 이는 특히 대규모 데이터셋에서 쿼리 속도를 크게 개선합니다.
추가적인 이점과 에코시스템
Iceberg은 Parquet, Avro, ORC 같은 다양한 파일 포맷을 지원하며, 특정 파일 포맷에 종속되지 않는 유연성을 제공합니다. 이는 예상치 못한 이점으로, 사용자가 데이터 저장 방식에 따라 자유롭게 선택할 수 있습니다. 또한, Apache Spark, Flink, Hive와 같은 엔진과의 통합을 지원하며, 클라우드 환경(AWS, Google BigQuery, Azure Synapse)에서도 널리 사용됩니다.
실제 사용 사례로, Netflix는 데이터 웨어하우스 구축, Expedia는 실시간 데이터 처리에 Iceberg을 활용하며, 데이터 마이그레이션에도 유용하게 사용됩니다.
미래와 한계
Iceberg은 지속적으로 발전하며, 최신 업데이트와 로드맵은 공식 문서에서 확인할 수 있습니다. 커뮤니티 참여는 Slack, 메일링 리스트, GitHub를 통해 가능하며, 한계로는 초기 설정 복잡성과 특정 엔진과의 호환성 문제가 있을 수 있습니다.
Key Citations
'Data Analysis > Data Engineering' 카테고리의 다른 글
데이터 저장 형식 TextInputFormat/ Parquet 관련해서 정리 (0) | 2024.08.06 |
---|---|
Airflow에서 데코레이터(decorator)를 사용하는 이유 (0) | 2024.04.19 |
IBM Data Engineer - Introduction to Relational Databases (RDBMS) (0) | 2023.04.19 |
IBM Data Engineer - Extract, Transform, Load (ETL) (0) | 2023.04.18 |
IBM Data Engineer - Python for Data Science, AI & Development 3 (1) | 2023.04.18 |
댓글