这是与表格式比较 - 更改查询和 CDC博客文章相关的 Apache Iceberg 深入探讨,探讨了每种表格式如何支持更改查询表,包括完整的 CDC。这不是一个操作指南,而是通过其内部设计来检查 Iceberg 功能。
前言
在父博客文章中,描述了四种规范的更改查询类型:
最新状态:
- 仅追加:返回涵盖查询时间段的所有插入行。
- upsert:返回涵盖查询时间段的所有插入和更新行(无之前的图像)。这可能会或可能不会返回在该时间段内删除的行,这将取决于表格式。
CDC:
- 最小增量:涵盖查询时间段的最小化 CDC 结果。
- 完整增量:涵盖查询时间段的完整 CDC 结果,包括冗余更改。
还介绍了三种主要的 CDC 支持方法:在写入时物化 CDC 文件、读取时推断 CDC、行谱系(又名行跟踪)。Iceberg 目前没有原生的 CDC 支持,计算引擎必须实现自己的“读取时推断 CDC”实现。
相关内部背景
表格式的内部决定了如何实现更改查询,也可能决定这些早期仍在成熟技术的限制。
- Iceberg 快照类型:Iceberg 有不同类型的操作,每个提交的操作类型记录在其快照中,相关的快照类型有追加、覆盖、删除、替换。这些快照类型与 Iceberg 对更改查询的当前支持限制相关。
- 增量表扫描:Iceberg 核心模块为计算引擎提供了三种执行增量表扫描的方式:数据文件迭代器、增量变更日志扫描、快照迭代。
- 读取时推断 CDC 与复制写与合并读:在 Iceberg 中,计算引擎通过表使用的是复制写(COW)还是合并读(MOR),或两者都有,来确定如何知道哪些行已插入、更新和删除。COW 表需要进行行级比较,MOR 表则相对更高效。
仅追加和 Upsert 更改查询支持
- Apache Flink:使用 IncrementalAppendScan 方法支持消费可变表作为流源,对应仅追加更改查询,但不保证读取所有插入。
- Apache Spark:通过提供查询的起始时间戳或快照 ID 执行增量更改查询,与 Flink 相同,仅支持追加提交,不支持 upsert 更改查询。
- Spark Structured Streaming:使用快照迭代方法,仅支持追加提交,若要避免流读取出错,需使用特定配置跳过覆盖和删除提交。
Spark 还通过 create_changelog_view 过程为 Iceberg 表添加变更日志视图,用于执行 CDC 更改查询,但主要限制是不返回删除文件,不适合 MOR 表,且增量变更日志扫描仅支持 COW。
行谱系(即将进入 Iceberg)
行谱系需要为每行写入额外的元数据,包括行 ID 和行版本列,仅追加更改查询可通过扫描添加的数据文件来实现高效查询,CDC 更改查询可使用版本列读取删除和更新前的行。Snowflake 工程师有关于 Iceberg 中行谱系的早期设计文档,希望能进入 Iceberg v3。
结论
当前 Flink、Spark 和 Spark Structured Streaming 对 Iceberg 更改查询的支持:
- 仅追加:支持,但仅支持追加快照,可能错过一些插入,行谱系可解决此问题。
- upsert:不支持,但计算引擎可实现,尤其对于 MOR 表。
- 最小增量:仅 Spark 通过“读取时推断 CDC”实现。
- 完整增量:仅 Spark 通过“读取时推断 CDC”实现。
表格式的底层设计使某些功能对计算引擎实现更高效或更困难,Iceberg 在最新状态(仅追加/upsert)和 CDC 更改查询方面都有改进空间,行谱系有望有所帮助。同时,还比较了基于行谱系的 CDC 实现与“写入时物化 CDC 文件”方法的性能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。