

# Apache Iceberg V3 の使用
<a name="working-with-apache-iceberg-v3"></a>

Apache Iceberg バージョン 3 (V3) は、Apache Iceberg テーブル形式の仕様の最新バージョンであり、ペタバイト規模のデータレイクを構築するための高度な機能を導入し、パフォーマンスを向上させ、運用オーバーヘッドを削減します。V3 は、特にバッチ更新とコンプライアンス削除に関連して、バージョン (V2) で発生する一般的なパフォーマンスのボトルネックに対処します。

AWS は、Apache Iceberg バージョン 3 (V3) 仕様で定義されている削除ベクトル、行リネージュ、およびバリアントデータ型をサポートしています。これらの機能は、[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 ノートブック](https://docs.aws.amazon.com/next-generation-sagemaker/)、および [Amazon S3 Tables](https://aws.amazon.com/s3/features/tables/) を含む [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) ワークフローのコンピューティングコストが削減されます。この組み込み機能により、カスタム変更追跡実装が不要になります。

バリアントデータ型  
バリアントデータ型を使用すると、固定スキーマを事前に定義することなく、JSON などの半構造化データを Iceberg テーブルに直接書き込むことができます。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 テーブルを使用する前に、以下を確認してください。
+ 適切な IAM アクセス許可を持つ AWS アカウント
+ 1 つ以上の AWS 分析サービス (EMR、Glue、Amazon SageMaker Unified Studio ノートブック、または S3 Tables) へのアクセス
+ テーブルデータとメタデータを保存するための S3 バケット
+ 独自の Iceberg インフラストラクチャを構築している場合は、S3 Tables または汎用 S3 バケットの使用を開始するためのテーブルバケット
+ AWS Glue カタログの設定

### V3 テーブルの作成
<a name="creating-v3-tables"></a>

#### 新しい V3 テーブルの作成
<a name="creating-new-v3-tables"></a>

新しい 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 にアップグレードする
<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 の削除ベクトルファイルが使用されます
+ アップグレードでは、行リネージュ変更追跡レコードの履歴バックフィルは実行されません

### 削除ベクトルの有効化
<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)」を参照してください。

バリアントデータ型を使用すると、固定スキーマを事前に定義することなく、JSON などの半構造化データを Iceberg テーブルに直接書き込むことができます。効率的な分析クエリのパフォーマンスを維持しながら、データを迅速に書き込むことができます。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>

エラー: 「format-version 3 is not supported」  
+ Iceberg V3 との互換性については、クエリエンジンカタログを確認してください。
+ 最新バージョンの AWS のサービスを使用していることを確認してください。
+ エンジンバージョンが V3 をサポートしていることを検証します

  Amazon AWS サービスの V3 サポートは次のとおりです。    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/working-with-apache-iceberg-v3.html)

  \*一部のリージョンでのみ利用可能

アップグレード後のパフォーマンスの低下  
+ 圧縮の失敗がないことを確認します。詳細については、「[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 サポートにお問い合わせください
+ Apache Iceberg コミュニティ: Iceberg Slack
+ AWS ドキュメント: AWS Analytics ドキュメント

## 料金
<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 データカタログ、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)