

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

Apache Iceberg 版本 3（V3）是 Apache Iceberg 表格式规范的最新版本，此版本引入了高级功能用于构建 PB 级数据湖，同时改善性能并降低运营开销。V3 解决了 V2 中会遇到的常见性能瓶颈，尤其是在批量更新和合规删除方面。

AWS 支持删除向量和行谱系，如 Apache Iceberg 版本 3（V3）规范中定义。这些功能可在下列服务中使用：[Amazon EMR 7.12](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 融通式合作开发工作室笔记本](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 表（包括 [Amazon S3 表类数据存储服务](https://aws.amazon.com/s3/features/tables/)）。

## V3 中的主要功能
<a name="key-features-v3"></a>

删除向量  
将 V2 中的位置删除文件替换成存储为 Puffin 文件的高效二进制格式。这消除了随机批量更新和 GDPR 合规删除带来的写入放大，从而大幅降低维护刷新数据的开销。如果组织在处理高频率更新，可以立即体验到写入性能改进，并可以通过减少小文件来降低存储成本。

行谱系  
实现了行级别的精确变更跟踪。您的下游系统可以通过递增方式处理更改，从而加快数据管道并降低更改数据捕获（CDC）工作流的计算成本。此内置功能消除了实施自定义变更跟踪的需求。

## 版本兼容性
<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 融通式合作开发工作室笔记本或 S3 表类数据存储服务）的访问权限
+ S3 存储桶，用于存储表数据和元数据
+ 表存储桶，用于开始使用 S3 表类数据存储服务，如果您在构建自己的 Iceberg 基础设施，则是 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
```

\$1row\$1id 字段唯一地标识每行，而 \$1last\$1updated\$1sequence\$1number 则跟踪上次修改该行的时间。使用这些字段可以：
+ 标识已更改的行来进行增量处理
+ 跟踪数据血统以确保合规性
+ 优化 CDC 管道
+ 仅处理更改过的内容，从而降低计算成本

## 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="troubleshooting"></a>

### 常见问题
<a name="common-issues"></a>

错误：“不支持 format-version 3”  
+ 验证您的引擎版本是否支持 V3

  V3 对 AWS 服务的支持如下：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonS3/latest/userguide/working-with-apache-iceberg-v3.html)
+ 检查目录兼容性
+ 确保 AWS 服务版本为最新

升级后的性能下降  
+ 确认没有压缩故障。有关更多详细信息，请参阅 [S3 表类数据存储服务的日志记录和监控](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 Support：有关特定服务的问题，请联系 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：[作业运行和 Data Catalog 定价](https://aws.amazon.com/glue/pricing/)
+ S3 表类数据存储服务：[存储和请求定价](https://aws.amazon.com/s3/pricing/)

## 可用性
<a name="availability"></a>

所有提供 Amazon EMR、AWS Glue Data Catalog、AWS Glue ETL 和 S3 表类数据存储服务的 AWS 区域均支持 Apache Iceberg V3。

## 其他资源
<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)