View a markdown version of this page

使用 Apache Iceberg V3 - Amazon Simple Storage Service

使用 Apache Iceberg V3

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

AWS 支持删除向量、行谱系以及变体数据类型,如 Apache Iceberg 版本 3(V3)规范中所定义。您可以在下列服务中使用这些功能:Amazon EMR 上的 Apache Spark、AWS Glue ETLAmazon SageMaker 融通式合作开发工作室笔记本;以及 AWS Glue Data Catalog 中的 Apache Iceberg 表(包括 Amazon S3 表类数据存储服务)。变体数据类型特定于 S3 表类数据存储服务。

V3 中的主要功能

删除向量

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

行谱系

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

变体数据类型

使用变体数据类型,您可以直接在 Iceberg 表中写入 JSON 等半结构化数据,而无需事先定义固定的架构。与 V3 兼容的引擎会在您写入半结构化数据时将其分解为隐藏列,并生成 Parquet 列统计信息,供查询引擎用于文件裁剪等优化。这会减少分析查询扫描的数据量。S3 表类数据存储服务为变体列提供持续的表维护(包括压缩),因此,您可以将来自半结构化源的数据整合到更大的文件中,以便 Iceberg 引擎高效读取。

版本兼容性

V3 保持与 V2 表的向后兼容性。AWS 服务同时支持 V2 和 V3 表,让您可以:

  • 在 V2 和 V3 表上运行查询

  • 无需数据重写即可将现有 V2 表升级到 V3

  • 执行跨 V2 和 V3 快照的时间旅行查询

  • 跨表版本使用架构演变和隐藏分区

重要

V3 是一个单向升级。表从 V2 升级到 V3 后,就无法通过标准操作将其降级回 V2。

开始使用 V3

先决条件

使用 V3 表之前,请确保您具有:

  • AWS 账户和相应的 IAM 权限

  • 一项或多项 AWS 分析服务(EMR、Glue、Amazon SageMaker 融通式合作开发工作室笔记本或 S3 表类数据存储服务)的访问权限

  • S3 存储桶,用于存储表数据和元数据

  • 表存储桶,用于开始使用 S3 表类数据存储服务,如果您在构建自己的 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 管道

  • 仅处理更改过的内容,从而降低计算成本

使用变体数据类型

重要

变体数据类型仅在特定 AWS 区域可用。有关支持的区域的完整列表,请参阅可用性

使用变体数据类型,您可以直接在 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 表类数据存储服务时,变体列的表维护(包括压缩)会自动运行。压缩可将来自半结构化源的数据从小文件合并为更大的文件,Iceberg 引擎可以更高效地读取这些文件,以便随时间推移提升查询性能。

V3 最佳实践

何时使用 V3

在以下情况下,可以考虑升级到 V3 或直接开始使用 V3:

  • 您经常执行批量更新或删除

  • 您需要满足 GDPR 或合规删除要求

  • 您的工作负载涉及频繁的更新插入

  • 您需要高效的 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 特定指标的监控控制面板

压缩注意事项

默认情况下,压缩会写入经过分解的变体 Parquet 文件。不支持分解的旧版读取器可能无法读取压缩后的文件。您可以通过设置表属性 write.variant.shredding.enabled=false 来禁用分解。

问题排查

常见问题

错误:“不支持 format-version 3”
  • 请查阅您的查询引擎目录,了解与 Iceberg V3 的兼容性。

  • 请确保您使用的是最新的 AWS 服务版本。

  • 验证您的引擎版本是否支持 V3

    V3 对 AWS 服务的支持如下:

    服务 V3 支持 V3 变体支持
    EMR Spark 发行版 7.12+ 版本 8.0+
    AWS Glue ETL
    Amazon SageMaker 融通式合作开发工作室笔记本
    AWS Glue:Iceberg REST API,表维护
    Amazon S3 表类数据存储服务:Iceberg REST API、表维护 是*
    Amazon Athena(Trino)

    *部分区域可用性

升级后的性能下降
  • 确认没有压缩故障。有关更多详细信息,请参阅 S3 表类数据存储服务的日志记录和监控

  • 检查是否启用了删除向量。确保已设置下列属性:

    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 分析文档

定价

可用性

所有提供 Amazon EMR、AWS Glue Data Catalog、AWS Glue ETL 和 S3 表类数据存储服务的 AWS 区域均支持 Apache Iceberg V3 的删除向量和行谱系功能。

以下 AWS 区域提供了 S3 表类数据存储服务中的变体数据类型:美国东部(弗吉尼亚州北部)、美国东部(俄亥俄州)、美国西部(俄勒冈州)、亚太地区(孟买)、亚太地区(首尔)、亚太地区(新加坡)、亚太地区(悉尼)、亚太地区(东京)、加拿大(中部)、欧洲地区(法兰克福)、欧洲地区(爱尔兰)、欧洲地区(伦敦)、欧洲地区(巴黎)、欧洲地区(斯德哥尔摩)和南美洲(圣保罗)。

其他资源