Apache Hudi 1.0.0 是 Apache Hudi 的一个重要里程碑版本。此版本包含重要的格式更改和令人兴奋的新功能。
我们鼓励用户首先在新表上试用 1.0.0 功能。1.0 通用版本 (GA) 将支持从 0.x 版本自动升级表,同时确保在使用 1.0 读取 0.x Hudi 表时完全向后兼容,从而确保无缝迁移体验。
此版本带有向后兼容的写入功能,即1.0.0可以写入表版本8(最新)和较旧的表版本6(对应于0.14及以上)格式。完全支持从 0.x 版本自动升级表,从而最大限度地减少迁移挑战。在所有读取器都升级之前,用户仍然可以为写入器部署 1.0.0 二进制文件,并利用向后兼容的写入继续以旧格式写入表。读取器完全升级后,用户可以通过配置更改切换到最新格式。我们建议用户按照迁移指南[1]中提到的升级步骤进行操作,以确保顺利过渡。
注意: 大多数事情都由自动升级过程无缝处理,但存在一些限制。在继续迁移之前,请仔细阅读升级降级过程的限制。请查看迁移指南[2] 和 RFC-78[3] 了解更多详情。
涵盖所有格式更改的主要史诗是 HUDI-6242[5],它也包含在 Hudi 1.0 技术规范[6]中。以下是格式更改方面的主要亮点:
.hoodie/timeline
目录。clustering,
以使其与其他 replacecommit
操作区别。1.0.0 引入了非阻塞并发控制 (NBCC),支持无冲突的多流并发摄取。这是一种通用并发模型,适用于流处理或高争用/频繁写入场景。与乐观并发控制相比,在乐观并发控制中,只要有争用写入器会中止事务,这项创新允许对同一个 Hudi 表进行多次流式写入,而不会产生任何冲突解决的开销,同时保留流式系统中的事件时间排序语义,以及异步表服务,例如压缩、归档和清理。
要了解有关 NBCC 的更多信息,请参阅此博客[8],其中还包括 Flink 写入端的演示。
1.0.0 为 Apache Hudi 的多模态索引子系统引入了新的索引。这些索引旨在通过分区修剪和进一步跳过数据来提高查询性能。
二级索引允许用户在不属于 Hudi 表中记录键列的列上创建索引。它可用于加快对记录键列以外的列使用谓词的查询速度。
分区统计索引在分区级别聚合启用了它的列的统计信息。这有助于高效的分区修剪,即使对于非分区字段也是如此。
表达式索引支持对从表达式派生的列进行高效查询。它可以收集从表达式派生的列的统计信息,而无需具体化它们,并且可用于使用包含此类表达式的筛选器加快查询速度。
要了解有关这些索引的更多信息,请参阅 SQL 查询[9]文档。
1.0.0 扩展了对 Merge-on-Read 表的部分更新支持,这允许用户仅更新记录中的列子集。当用户只想更新记录中的几列而不重写整个记录时,此功能非常有用。
要了解有关部分更新的更多信息,请参阅 SQL DML[10] 文档。
hoodie.table.multiple.base.file.formats.enable
.要了解有关格式更改的更多信息,请参阅 Hudi 1.0 技术规范[11]。
1.0.0 引入了几项 API 变更,包括:
HoodieRecordPayload
接口已被弃用,取而代之的是新的 HoodieRecordMerger
接口。记录合并是一个通用接口,允许用户定义用于合并基本文件和日志文件记录的自定义逻辑。此版本提供了一些开箱即用的合并模式,这些模式定义了基文件和日志文件在文件切片中的排序方式,以及如何一致地合并该文件切片中具有相同记录键的不同记录,以便为快照查询、写入器和表服务生成相同的确定性结果。具体来说,支持三种合并模式作为表级配置:
COMMIT_TIME_ORDERING
:合并只是选择属于最新写入 (提交时间) 的记录作为合并结果。EVENT_TIME_ORDERING
:合并会选择用户指定的排序或预组合字段上具有最高值的记录作为合并结果。CUSTOM:
用户可以提供自定义的合并实现,以便更好地控制合并逻辑。注意:我们建议用户迁移并使用记录合并器 API,而不是编写新的有效负载实现。
hoodie.merge.use.record.positions=true
激活位置合并。新读取器在基于键的合并下,部分更新的性能提升令人印象深刻。对于大小为 1TB 的 MOR 表,具有 100 个分区,后续提交中有 80% 的随机更新,新读取器的快照查询速度提高了 5.7 倍,写入放大率降低了 70 倍。
[1]
迁移指南: https://hudi.apache.org/docs/deployment#upgrading-to-100
[2]
迁移指南: https://hudi.apache.org/docs/deployment#upgrading-to-100
[3]
RFC-78: https://github.com/apache/hudi/blob/master/rfc/rfc-78/rfc-78.md#support-matrix-for-different-readers-and-writers
[4]
0.15.0 版本中: https://hudi.apache.org/releases/release-0.15.0#new-spark-bundles
[5]
HUDI-6242: https://issues.apache.org/jira/browse/HUDI-6242
[6]
Hudi 1.0 技术规范: https://hudi.apache.org/tech-specs-1point0
[7]
规范: https://hudi.apache.org/tech-specs-1point0#log-format
[8]
此博客: https://hudi.apache.org/blog/2024/12/06/non-blocking-concurrency-control
[9]
SQL 查询: https://hudi.apache.org/docs/sql_queries#snapshot-query-with-index-acceleration
[10]
SQL DML: https://hudi.apache.org/docs/sql_dml#merge-into-partial-update
[11]
Hudi 1.0 技术规范: https://hudi.apache.org/tech-specs-1point0