Apache Iceberg V3 사용하기
Apache Iceberg V3 사용하기 (Working with Apache Iceberg V3)
Apache Iceberg 버전 3(V3)은 Apache Iceberg 테이블 형식 스펙의 최신 버전으로, 향상된 성능과 줄어든 운영 오버헤드로 페타바이트 규모 데이터 레이크를 구축하기 위한 고급 기능을 도입했어요. V3는 버전 2(V2)에서 마주치던 흔한 성능 병목(특히 배치 업데이트와 규정 준수 삭제 주변)을 해결해요.
출처: 문서
본문
AWS는 Apache Iceberg 버전 3(V3) 스펙에 정의된 삭제 벡터(Deletion Vectors), 행 계보(Row-lineage), variant 데이터 타입을 지원해요. Amazon EMR의 Apache Spark, AWS Glue ETL, Amazon SageMaker Unified Studio Notebooks, 그리고 Amazon S3 Tables를 포함한 AWS Glue Data Catalog의 Apache Iceberg 테이블에서 이 기능들을 사용할 수 있어요. variant 데이터 타입은 S3 Tables에 특화된 기능이에요.
V3의 주요 기능
삭제 벡터 (Deletion Vectors)
V2의 위치 기반(positional) 삭제 파일을 Puffin 파일로 저장되는 효율적인 이진 형식으로 대체해요. 이는 임의 배치 업데이트와 GDPR 규정 준수 삭제에서 오는 쓰기 증폭을 제거해, 신선한 데이터를 유지하는 오버헤드를 크게 줄여줘요. 높은 빈도로 업데이트를 처리하는 조직은 쓰기 성능의 즉각적인 개선과, 더 적은 소형 파일로 인한 스토리지 비용 절감을 보게 돼요.
행 계보 (Row-lineage)
행 수준의 정확한 변경 추적을 가능하게 해요. 다운스트림 시스템이 변경 사항을 증분 처리할 수 있어 데이터 파이프라인이 빨라지고 변경 데이터 캡처(CDC) 워크플로우의 컴퓨팅 비용이 줄어들어요. 이 내장 기능 덕분에 커스텀 변경 추적 구현이 필요 없어져요.
variant 데이터 타입
variant 데이터 타입을 사용하면 미리 고정 스키마를 정의하지 않고도 JSON 같은 반정형 데이터를 Iceberg 테이블에 직접 쓸 수 있어요. V3 호환 엔진이 작성할 때 반정형 데이터를 숨은 컬럼(hidden column)으로 분해(shred)하고, 쿼리 엔진이 파일 프루닝 같은 최적화에 사용하는 Parquet 컬럼 통계를 생성해요. 이 덕분에 분석 쿼리가 스캔하는 데이터가 줄어들어요. S3 Tables는 압축을 포함해 variant 컬럼에 대한 지속적인 테이블 유지 관리를 제공하므로, 반정형 소스의 데이터를 Iceberg 엔진이 효율적으로 읽을 수 있는 더 큰 파일로 통합할 수 있어요.
버전 호환성
V3는 V2 테이블과 하위 호환성을 유지해요. AWS 서비스는 V2와 V3 테이블을 동시에 지원해서 다음을 할 수 있게 해줘요.
- V2와 V3 테이블 모두에서 쿼리 실행
- 데이터 재작성 없이 기존 V2 테이블을 V3로 업그레이드
- V2와 V3 스냅샷에 걸친 타임트래블 쿼리 실행
- 테이블 버전에 걸친 스키마 진화와 숨은 파티셔닝 사용
중요: V3는 단방향 업그레이드예요. 테이블이 V2에서 V3로 업그레이드되면 표준 작업으로는 V2로 되돌릴 수 없어요.
V3 시작하기
사전 조건
V3 테이블로 작업하기 전에 다음이 있는지 확인하세요.
- 적절한 IAM 권한이 있는 AWS 계정
- 하나 이상의 AWS 분석 서비스(EMR, Glue, Amazon SageMaker Unified Studio Notebooks, S3 Tables)에 대한 접근
- 테이블 데이터와 메타데이터를 저장할 S3 버킷
- S3 Tables로 시작하기 위한 테이블 버킷, 또는 자체 Iceberg 인프라를 구축하는 경우 일반 용도 S3 버킷
- 구성된 AWS Glue 카탈로그
V3 테이블 만들기
새 V3 테이블 만들기
새 Iceberg V3 테이블을 만들려면 format-version 테이블 속성을 3으로 설정해요.
Spark SQL 사용:
CREATE TABLE IF NOT EXISTS myns.orders_v3 (
order_id bigint,
customer_id string,
order_date date,
total_amount decimal(10,2),
status string,
created_at timestamp
)
USING iceberg
TBLPROPERTIES (
'format-version' = '3'
)
V2 테이블을 V3로 업그레이드하기
기존 V2 테이블을 데이터 재작성 없이 원자적으로 V3로 업그레이드할 수 있어요.
Spark SQL 사용:
ALTER TABLE myns.existing_table
SET TBLPROPERTIES ('format-version' = '3')
중요: V3는 단방향 업그레이드예요. 테이블이 V2에서 V3로 업그레이드되면 표준 작업으로는 V2로 되돌릴 수 없어요.
업그레이드 중 일어나는 일:
- 새 메타데이터 스냅샷이 원자적으로 생성돼요.
- 기존 Parquet 데이터 파일이 재사용돼요.
- 테이블 메타데이터에 행 계보 필드가 추가돼요.
- 다음 압축이 이전 V2 삭제 파일을 제거해요.
- 새 수정 사항이 V3의 삭제 벡터 파일을 사용해요.
- 업그레이드는 행 계보 변경 추적 레코드의 과거 백필을 수행하지 않아요.
삭제 벡터 활성화하기
업데이트, 삭제, 병합에 삭제 벡터를 활용하려면 쓰기 모드를 구성해요.
Spark SQL 사용:
ALTER TABLE myns.orders_v3
SET TBLPROPERTIES ('format-version' = '3',
'write.delete.mode' = 'merge-on-read',
'write.update.mode' = 'merge-on-read',
'write.merge.mode' = 'merge-on-read'
)
이 설정으로 업데이트, 삭제, 병합 작업이 전체 데이터 파일을 재작성하는 대신 삭제 벡터 파일을 만들게 해요.
변경 추적에 행 계보 활용하기
V3는 변경 추적을 위해 행 계보 메타데이터 필드를 자동으로 추가해요.
Spark SQL 사용:
# Query with parameter value provided
last_processed_sequence = 47
SELECT
id,
data,
_row_id,
_last_updated_sequence_number
FROM myns.orders_v3
WHERE _last_updated_sequence_number > :last_processed_sequence
_row_id 필드는 각 행을 고유하게 식별하고, _last_updated_sequence_number는 행이 마지막으로 수정된 시점을 추적해요. 이 필드를 다음 용도로 사용해요.
- 증분 처리를 위한 변경된 행 식별
- 규정 준수를 위한 데이터 계보 추적
- CDC 파이프라인 최적화
- 변경 사항만 처리해 컴퓨팅 비용 절감
variant 데이터 타입 사용하기
중요: variant 데이터 타입은 특정 AWS 리전에서만 사용할 수 있어요. 지원 리전 전체 목록은 "Availability" 문서를 참고하세요.
variant 데이터 타입을 사용하면 미리 고정 스키마를 정의하지 않고도 JSON 같은 반정형 데이터를 Iceberg 테이블에 직접 쓸 수 있어요. 데이터를 더 빨리 쓰면서도 효율적인 분석 쿼리 성능을 얻을 수 있어요. Iceberg V3 호환 엔진은 작성할 때 반정형 데이터를 숨은 컬럼으로 분해해요. 이 숨은 컬럼들은 쿼리 엔진이 파일 프루닝 같은 최적화에 사용하는 Parquet 컬럼 통계를 생성해요.
Spark SQL로 variant 컬럼이 있는 테이블 만들기:
CREATE TABLE IF NOT EXISTS myns.events (
event_id bigint,
event_timestamp timestamp,
source string,
event_data VARIANT
)
USING iceberg
TBLPROPERTIES (
'format-version' = '3'
)
variant 컬럼에 반정형 데이터 삽입하기:
INSERT INTO myns.events VALUES (
1,
current_timestamp(),
'web-app',
PARSE_JSON('{"user_id": "u-1234", "action": "page_view", "page": "/products", "duration_ms": 350}')
);
INSERT INTO myns.events VALUES (
2,
current_timestamp(),
'mobile-app',
PARSE_JSON('{"user_id": "u-5678", "action": "purchase", "items": [{"sku": "A100", "qty": 2}], "total": 49.99}')
);
S3 Tables에서는 variant 컬럼에 대한 테이블 유지 관리(압축 포함)가 자동으로 실행돼요. 압축은 반정형 소스의 데이터를 소형 파일에서 Iceberg 엔진이 더 효율적으로 읽을 수 있는 대형 파일로 통합해, 시간이 지나면서 쿼리 성능을 개선해요.
V3 모범 사례
V3를 언제 써야 하나
다음 경우에 V3로 업그레이드하거나 V3로 시작하는 것을 고려해요.
- 빈번한 배치 업데이트나 삭제를 수행하는 경우
- GDPR 또는 규정 준수 삭제 요구 사항을 충족해야 하는 경우
- 워크로드에 고빈도 upsert가 포함된 경우
- 효율적인 CDC 워크플로우가 필요한 경우
- 소형 파일로 인한 스토리지 비용을 줄이려는 경우
- 더 나은 변경 추적 기능이 필요한 경우
쓰기 성능 최적화하기
- 업데이트가 많은 워크로드에는 삭제 벡터를 활성화해요:
SET TBLPROPERTIES ( 'write.delete.mode' = 'merge-on-read', 'write.update.mode' = 'merge-on-read', 'write.merge.mode' = 'merge-on-read' ) - 적절한 파일 크기를 구성해요:
SET TBLPROPERTIES ( 'write.target-file-size-bytes' = '536870912' — 512 MB )
읽기 성능 최적화하기
- 증분 처리를 위해 행 계보를 활용해요.
- 복사 없이 과거 데이터에 접근하려면 타임트래블을 사용해요.
- 쿼리 계획을 개선하려면 통계 수집을 활성화해요.
마이그레이션 전략
V2에서 V3로 마이그레이션할 때:
- 먼저 프로덕션이 아닌 환경에서 테스트해요 – 업그레이드 프로세스와 성능을 검증해요.
- 활동이 적은 시간대에 업그레이드해요 – 동시 작업에 대한 영향을 최소화해요.
- 초기 성능을 모니터링해요 – 업그레이드 후 메트릭을 추적해요.
- 압축을 실행해요 – 업그레이드 후 삭제 파일을 통합해요.
- 문서를 업데이트해요 – 팀 문서에 V3 기능을 반영해요.
호환성 고려 사항
- 엔진 버전 – 테이블에 접근하는 모든 엔진이 V3를 지원하는지 확인해요.
- 서드파티 도구 – 업그레이드 전에 V3 호환성을 확인해요.
- 백업 전략 – 스냅샷 기반 복구 절차를 테스트해요.
- 모니터링 – V3 특정 메트릭에 맞게 모니터링 대시보드를 업데이트해요.
압축에 대한 고려 사항
압축은 기본적으로 분해된(shredded) variant Parquet 파일을 작성해요. 분해를 지원하지 않는 이전 버전의 리더는 압축된 파일을 읽지 못할 수 있어요. write.variant.shredding.enabled=false 테이블 속성을 설정해 분해를 끌 수 있어요.
트러블슈팅
일반적인 문제
오류: "format-version 3 is not supported"
- 쿼리 엔진 카탈로그가 Iceberg V3와 호환되는지 확인해요.
- 최신 AWS 서비스 버전을 사용하고 있는지 확인해요.
- 엔진 버전이 V3를 지원하는지 확인해요. AWS 서비스의 V3 지원은 다음과 같아요.
| 서비스 | V3 지원 | V3 variant 지원 |
|---|---|---|
| EMR Spark | 릴리즈 7.12+ | 릴리즈 8.0+ |
| AWS Glue ETL | 버전 5.1+ | 버전 6.0+ |
| Amazon SageMaker Unified Studio Notebooks | 예 | 아니요 |
| AWS Glue: Iceberg REST API, 테이블 유지 관리 | 예 | 아니요 |
| Amazon S3 Tables: Iceberg REST API, 테이블 유지 관리 | 예 | 예* |
| Amazon Athena (Trino) | 아니요 | 아니요 |
| Amazon Redshift | 패치 204+ | 아니요 |
*부분 리전 가용성
업그레이드 후 성능 저하
- 압축 실패가 없는지 확인해요. 자세한 내용은 "Logging and monitoring for S3 Tables" 문서를 참고하세요.
- 삭제 벡터가 활성화되어 있는지 확인해요. 다음 속성이 설정되어 있는지 확인하세요:
SET TBLPROPERTIES ( 'write.delete.mode' = 'merge-on-read', 'write.update.mode' = 'merge-on-read', 'write.merge.mode' = 'merge-on-read' ) - 다음 코드로 테이블 속성을 확인할 수 있어요:
DESCRIBE FORMATTED myns.orders_v3 - 파티션 전략을 검토해요. 과도한 파티셔닝은 소형 파일로 이어질 수 있어요. 다음 쿼리로 테이블의 평균 파일 크기를 구해요:
SELECT avg(file_size_in_bytes) as avg_file_size_bytes FROM myns.orders_v3.files
서드파티 도구와의 비호환성
- 도구가 V3 스펙을 지원하는지 확인해요.
- 지원하지 않는 도구에는 V2 테이블을 유지하는 것을 고려해요.
- V3 지원 일정에 대해 도구 공급업체에 문의해요.
도움 받기
- AWS Support: 서비스별 문제는 AWS Support에 문의해요.
- Apache Iceberg 커뮤니티: Iceberg Slack
- AWS 문서: AWS Analytics Documentation
요금
- Amazon EMR: 컴퓨팅·스토리지 요금
- Amazon SageMaker 요금
- AWS Glue: 작업 실행·Data Catalog 요금
- S3 Tables: 스토리지·요청 요금
가용성
삭제 벡터와 행 계보에 대한 Apache Iceberg V3 지원은 Amazon EMR, AWS Glue Data Catalog, AWS Glue ETL, S3 Tables가 운영되는 모든 AWS 리전에서 사용할 수 있어요.
S3 Tables의 variant 데이터 타입은 다음 AWS 리전에서 사용할 수 있어요: 미국 동부(버지니아 북부), 미국 동부(오하이오), 미국 서부(오레곤), 아시아 태평양(뭄바이), 아시아 태평양(서울), 아시아 태평양(싱가포르), 아시아 태평양(시드니), 아시아 태평양(도쿄), 캐나다(중부), 유럽(프랑크푸르트), 유럽(아일랜드), 유럽(런던), 유럽(파리), 유럽(스톡홀름), 남아메리카(상파울루).
추가 리소스
- Apache Iceberg V3 설명서
- 마이그레이션 모범 사례
- 시작하기 안내서
더 알아보기 (Learn more)
- Amazon MSK로 테이블 스트리밍하기 (Streaming tables with Amazon MSK)
- S3 테이블 복제하기 (Replicating S3 tables)