

# Apache Iceberg V3 작업
<a name="working-with-apache-iceberg-v3"></a>

Apache Iceberg 버전 3(V3)은 Apache Iceberg 테이블 형식 사양의 최신 버전으로, 성능이 향상되고 운영 오버헤드가 줄어 페타바이트 규모의 데이터 레이크를 빌드하기 위한 고급 기능을 도입했습니다. V3는 특히 배치 업데이트 및 규정 준수 삭제와 관련하여 버전 2(V2)에서 발생하는 일반적인 성능 병목 현상을 해결합니다.

AWS는 Apache Iceberg 버전 3(V3) 사양에 정의된 삭제 벡터, 행 계보, 변형 데이터 유형에 대한 지원을 제공합니다. 이러한 기능은 [Amazon S3 Tables](https://aws.amazon.com/s3/features/tables/)를 포함하여 [Amazon EMR](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/iceberg-emr.html)의 Apache Spark, [AWS Glue ETL](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/iceberg-glue.html), [Amazon SageMaker Unified Studio Notebooks](https://docs.aws.amazon.com/next-generation-sagemaker/), [AWS Glue Data Catalog](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)의 Apache Iceberg 테이블에서 사용할 수 있습니다. 변형 데이터 유형은 S3 Tables에 전용입니다.

## V3의 주요 기능
<a name="key-features-v3"></a>

삭제 벡터  
V2의 위치 삭제 파일을 Puffin 파일로 저장된 효율적인 바이너리 형식으로 바꿉니다. 이렇게 하면 무작위 배치 업데이트 및 GDPR 규정 준수 삭제로 인한 쓰기 증폭이 제거되므로 새로운 데이터를 유지 관리하는 데 드는 오버헤드가 크게 줄어듭니다. 잦은 업데이트를 처리하는 조직은 쓰기 성능이 즉시 향상되며 파일 수가 작아 스토리지 비용이 절감됩니다.

행 계보  
행 수준에서 정확한 변경 내용 추적을 활성화합니다. 다운스트림 시스템은 변경 사항을 점진적으로 처리하여 데이터 파이프라인 속도를 높이고 변경 데이터 캡처(CDC) 워크플로의 컴퓨팅 비용을 절감할 수 있습니다. 이 내장 기능을 사용하면 사용자 지정 변경 추적 구현이 필요하지 않습니다.

변형 데이터 유형  
변형 데이터 유형을 사용하면 고정된 스키마를 미리 정의하지 않고도 Iceberg 테이블에서 JSON과 같은 반정형 데이터를 직접 작성할 수 있습니다. V3 호환 엔진은 반정형 데이터를 작성할 때 이를 숨겨진 열로 분해하여 쿼리 엔진이 파일 정리와 같은 최적화에 사용하는 Parquet 열 통계를 생성합니다. 이렇게 하면 분석 쿼리가 스캔하는 데이터가 줄어듭니다. S3 Tables는 압축을 포함하여 변형 열에 대한 지속적인 테이블 유지 관리를 제공하므로 반정형 소스의 데이터를 Iceberg 엔진이 효율적으로 읽을 수 있는 더 큰 파일로 통합할 수 있습니다.

## 버전 호환성
<a name="version-compatibility"></a>

V3는 V2 테이블과의 이전 버전과의 호환성을 유지합니다. AWS 서비스는 V2 및 V3 테이블을 동시에 지원하므로 다음을 수행할 수 있습니다.
+ V2 및 V3 테이블 모두에서 쿼리 실행
+ 데이터 재작성 없이 기존 V2 테이블을 V3로 업그레이드
+ V2 및 V3 스냅샷에 걸쳐 시간 이동 쿼리 실행
+ 테이블 버전 간에 스키마 진화 및 숨겨진 파티셔닝 사용

**중요**  
V3는 단방향 업그레이드입니다. 테이블이 V2에서 V3로 업그레이드되면 표준 작업을 통해 다시 V2로 다운그레이드할 수 없습니다.

## V3 시작하기
<a name="getting-started-v3"></a>

### 사전 조건
<a name="prerequisites"></a>

V3 테이블로 작업하기 전에 다음을 확인해야 합니다.
+ AWS 계정 및 적절한 IAM 권한.
+ 하나 이상의 AWS 분석 서비스(EMR, Glue, Amazon SageMaker Unified Studio 노트북 또는 S3 Tables)에 대한 액세스
+ 테이블 데이터 및 메타데이터를 저장하기 위한 S3 버킷
+ S3 Tables를 시작하기 위한 테이블 버킷 또는 자체 Iceberg 인프라를 구축하는 경우 범용 S3 버킷
+ AWS구성된 Glue 카탈로그

### V3 테이블 생성
<a name="creating-v3-tables"></a>

#### 새 V3 테이블 생성
<a name="creating-new-v3-tables"></a>

새 Iceberg V3 테이블을 생성하려면 형식 버전 테이블 속성을 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로 업그레이드
<a name="upgrading-v2-to-v3"></a>

데이터를 다시 작성하지 않고도 기존 V2 테이블을 V3로 원자적으로 업그레이드할 수 있습니다.

**Spark SQL 사용:**

```
ALTER TABLE myns.existing_table  
SET TBLPROPERTIES ('format-version' = '3')
```

**중요**  
V3는 단방향 업그레이드입니다. 테이블이 V2에서 V3로 업그레이드되면 표준 작업을 통해 다시 V2로 다운그레이드할 수 없습니다.

**업그레이드 중에 발생하는 일:**
+ 새 메타데이터 스냅샷이 원자적으로 생성됨
+ 기존 Parquet 데이터 파일이 재사용됨
+ 행 계보 필드가 테이블 메타데이터에 추가됨
+ 다음 압축이 이전 V2 삭제 파일을 제거
+ 새 수정 사항이 V3의 Deletion Vector 파일을 사용
+ 업그레이드는 행 계보 변경 추적 레코드의 과거 채우기를 수행하지 않습니다.

### 삭제 벡터 활성화
<a name="enabling-deletion-vectors"></a>

업데이트, 삭제 및 병합에 삭제 벡터를 활용하려면 쓰기 모드를 구성합니다.

**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'  
                  )
```

이러한 설정은 업데이트, 삭제 및 병합 작업이 전체 데이터 파일을 다시 작성하는 대신 삭제 벡터 파일을 생성하도록 합니다.

### 변경 추적을 위한 행 계보 활용
<a name="leveraging-row-lineage"></a>

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 파이프라인 최적화
+ 변경 사항만 처리하여 컴퓨팅 비용 절감

### 변형 데이터 유형 사용
<a name="using-variant-data-type"></a>

**중요**  
변형 데이터 유형은 특정 AWS 리전에서만 사용할 수 있습니다. 지원되는 리전의 전체 목록은 [가용성](#availability) 섹션을 참조하세요.

변형 데이터 유형을 사용하면 고정된 스키마를 미리 정의하지 않고도 Iceberg 테이블에 JSON과 같은 반정형 데이터를 직접 쓸 수 있습니다. 효율적인 분석 쿼리 성능을 유지하면서 더 빠르게 데이터를 쓸 수 있습니다. Iceberg V3 호환 엔진은 반정형 데이터를 작성할 때 이를 숨겨진 열로 분해합니다. 이러한 숨겨진 열은 쿼리 엔진이 파일 정리와 같은 최적화에 사용하는 Parquet 열 통계를 생성합니다.

**Spark SQL을 사용하여 변형 열이 있는 테이블 생성:**

```
CREATE TABLE IF NOT EXISTS myns.events (
    event_id bigint,
    event_timestamp timestamp,
    source string,
    event_data VARIANT
)
USING iceberg
TBLPROPERTIES (
    'format-version' = '3'
)
```

**변형 열에 반정형 데이터 삽입:**

```
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를 사용하면 압축을 포함하여 변형 열에 대한 테이블 유지 관리가 자동으로 실행됩니다. 압축은 작은 파일의 반정형 소스 데이터를 Iceberg 엔진이 효율적으로 읽을 수 있는 더 큰 파일로 통합하여 시간이 지남에 따라 쿼리 성능을 개선합니다.

## V3의 모범 사례
<a name="best-practices-v3"></a>

### V3를 사용해야 하는 경우
<a name="when-to-use-v3"></a>

다음과 같은 경우 V3로 업그레이드하거나 V3로 시작하는 것이 좋습니다.
+ 배치 업데이트 또는 삭제를 자주 수행
+ GDPR 또는 규정 준수 삭제 요구 사항을 충족해야 함
+ 워크로드에 잦은 업서트 포함
+ 효율적인 CDC 워크플로 필요
+ 작은 파일에서 스토리지 비용을 줄여야 함
+ 더 나은 변경 추적 기능이 필요

### 쓰기 성능 최적화
<a name="optimizing-write-performance"></a>
+ 업데이트가 많은 워크로드에 대해 삭제 벡터 활성화:

  ```
  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  
  )
  ```

### 읽기 성능 최적화
<a name="optimizing-read-performance"></a>
+ 증분 처리를 위한 행 계보 활용
+ 복사하지 않고 시간 이동을 사용하여 기록 데이터에 액세스
+ 더 나은 쿼리 계획을 위해 통계 수집 활성화

## 마이그레이션 전략
<a name="migration-strategy"></a>

V2에서 V3로 마이그레이션하는 경우:
+ 비프로덕션 우선 테스트 - 업그레이드 프로세스 및 성능 검증
+ 활동이 적은 기간 동안 업그레이드 - 동시 작업에 미치는 영향 최소화
+ 초기 성능 모니터링 - 업그레이드 후 지표 추적
+ 압축 실행 - 업그레이드 후 삭제 파일 통합
+ 설명서 업데이트 - 팀 설명서의 V3 기능 반영

## 호환성 고려 사항
<a name="compatibility-considerations"></a>
+ 엔진 버전 - 테이블에 액세스하는 모든 엔진이 V3를 지원하는지 확인
+ 타사 도구 - 업그레이드하기 전에 V3 호환성 확인
+ 백업 전략 - 스냅샷 기반 복구 절차 테스트
+ 모니터링 - V3별 지표에 대한 모니터링 대시보드 업데이트

### 압축 고려 사항
<a name="considerations-for-compaction"></a>

압축은 기본적으로 분해된 변형 Parquet 파일을 씁니다. 분해 기능을 지원하지 않는 이전 리더는 압축된 파일을 읽지 못할 수 있습니다. 테이블 속성 `write.variant.shredding.enabled=false`를 설정하여 분해 기능을 비활성화할 수 있습니다.

## 문제 해결
<a name="troubleshooting"></a>

### 공통 문제
<a name="common-issues"></a>

오류: "형식-버전 3이 지원되지 않음"  
+ 쿼리 엔진 카탈로그에서 Iceberg V3와의 호환성을 확인하세요.
+ 최신 AWS 서비스 버전을 사용하고 있는지 확인합니다.
+ 엔진 버전이 V3를 지원하는지 확인

  Amazon AWS 서비스에 대한 V3 지원은 다음과 같습니다.


<table>
<thead>
  <tr><th>서비스</th><th>V3 지원</th><th>V3 변형 지원</th></tr>
</thead>
<tbody>
  <tr><td>EMR Spark</td><td>릴리스 7.12+</td><td>릴리스 8.0+</td></tr>
  <tr><td>AWS Glue ETL</td><td>예</td><td>아니요</td></tr>
  <tr><td>Amazon SageMaker Unified Studio 노트북</td><td>예</td><td>아니요</td></tr>
  <tr><td>AWS Glue: Iceberg REST API, 테이블 유지 관리</td><td>예</td><td>아니요</td></tr>
  <tr><td>Amazon S3 Tables: Iceberg REST API, 테이블 유지 관리</td><td>예</td><td>예*</td></tr>
  <tr><td>Amazon Athena(Trino)</td><td>아니요</td><td>아니요</td></tr>
</tbody>
</table>


  \*부분적 리전 가용성

업그레이드 후 성능 저하  
+ 압축 실패가 없는지 확인합니다. 자세한 내용은 [S3 Tables에 대한 로깅 및 모니터링](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-monitoring-overview.html)을 참조하세요.
+ 삭제 벡터가 활성화되어 있는지 확인합니다. 다음과 같은 속성이 설정되었는지 확인합니다.

  ```
  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 지원 타임라인에 대한 문의 도구 공급업체

### 도움말 보기
<a name="getting-help"></a>
+ AWS 지원: 서비스별 문제는 AWS Support에 문의하세요.
+ Apache Iceberg 커뮤니티: Iceberg Slack
+ AWS 설명서: AWS 분석 설명서

## 가격 책정
<a name="pricing"></a>
+ Amazon EMR: [컴퓨팅 및 스토리지 요금](https://aws.amazon.com/emr/pricing/)
+ [Amazon SageMaker 요금](https://aws.amazon.com/sagemaker/pricing/)
+ AWS Glue: [작업 실행 및 데이터 카탈로그 요금](https://aws.amazon.com/glue/pricing/)
+ S3 Tables: [스토리지 및 요청 요금](https://aws.amazon.com/s3/pricing/)

## 가용성
<a name="availability"></a>

삭제 벡터 및 행 계보에 대한 Apache Iceberg V3 지원은 Amazon EMR, AWS Glue Data Catalog, AWS Glue ETL 및 S3 Tables가 운영되는 모든 AWS 리전에서 사용할 수 있습니다.

S3 Tables의 변형 데이터 유형은 다음 AWS 리전에서 사용할 수 있습니다. 미국 동부(버지니아 북부), 미국 동부(오하이오), 미국 서부(오리건), 아시아 태평양(뭄바이), 아시아 태평양(서울), 아시아 태평양(싱가포르), 아시아 태평양(시드니), 아시아 태평양(도쿄), 캐나다(중부), 유럽(프랑크푸르트), 유럽(아일랜드), 유럽(런던), 유럽(파리), 유럽(스톡홀름), 남아메리카(상파울루).

## 추가 리소스
<a name="additional-resources"></a>
+ [Apache Iceberg V3 설명서](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/introduction.html)
+ [마이그레이션 모범 사례](https://aws.amazon.com/solutions/guidance/migrating-tabular-data-from-amazon-s3-to-s3-tables/)
+ [시작 안내서](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-getting-started.html)