View a markdown version of this page

使用 Apache Iceberg V3 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)。

使用 Apache Iceberg V3

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

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

V3 中的主要功能

删除向量

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

行谱系

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

变体数据类型

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

版本兼容性

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

  • 在 V2 和 V3 表上运行查询

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

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

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

重要

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

开始使用 V3

先决条件

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

  • Amazon 账户和相应的 IAM 权限

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

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

  • 表存储桶,用于开始使用 S3 表类数据存储服务,如果您在构建自己的 Iceberg 基础设施,则是 S3 通用存储桶

  • Amazon已配置 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 管道

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

使用变体数据类型

重要

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

使用变体数据类型,您可以直接在 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 的兼容性。

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

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

    V3 对 Amazon 服务的支持如下:

    服务 V3 支持 V3 变体支持
    EMR Spark 发行版 7.12+ 版本 8.0+
    Amazon Glue ETL 是 否
    Amazon SageMaker 融通式合作开发工作室笔记本 是 否
    Amazon 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 支持时间表

获取帮助

  • Amazon Support:有关特定服务的问题,请联系 Amazon Support

  • Apache Iceberg 社区:Iceberg Slack

  • Amazon 文档:Amazon 分析文档

定价

可用性

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

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

其他资源