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] 了解更多详情。
Bundle包更新
  • • 仍支持 0.15.0 版本中[4]支持的相同Bunle包。

  • • 新的 Flink Bundle包支持 Flink 1.19 和 Flink 1.20。

  • • 在此版本中我们弃用了 Spark 3 中对 Spark 3.2 或更低版本的支持。

发布重点格式更改

涵盖所有格式更改的主要史诗是 HUDI-6242[5],它也包含在 Hudi 1.0 技术规范[6]中。以下是格式更改方面的主要亮点:

Timeline 时间线

  • • 活动时间线和存档时间线二分法已被更具可扩展性的基于 LSM 树的时间线所取代。时间线布局现在对于时间范围查询和扩展到无限历史记录更加有条理和高效。

  • • 因此时间轴布局已更改,并且已移至表的基本路径下的.hoodie/timeline目录。

  • • 时间轴即时文件也发生了变化:

    • • 所有提交元数据都序列化为 Avro,从而允许所有操作之间元数据的未来兼容性和一致性。

    • • 已完成操作的即时文件现在包含完成时间。

    • • 待处理的 clustering instant 的操作现在已重命名为clustering,以使其与其他replacecommit操作区别。

日志文件格式
  • • 除了日志文件头中的键外我们还存储记录位置。有关更多详细信息,请参阅最新规范[7]。这允许我们进行基于位置的合并(除了基于键的合并)并基于位置跳过页面。

  • • 日志文件名现在将具有 deltacommit 即时时间,而不是基本提交即时时间。

  • • 新的日志文件格式还支持快速部分更新,存储开销较低。

与旧格式的兼容性
  • • **向后兼容写入:**Hudi 1.0写入现在支持以表格版本8(最新)和较旧的表格版本6(对应于0.14及以上)格式写入,确保与现有设置无缝集成。

  • • **自动升级:**完全支持 0.x 版本的表,从而最大限度地减少迁移挑战。我们也建议用户首先尝试迁移到0.14及以上版本,如果你有多个读取器/写入器/表服务的高级设置。

并发控制

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] 文档。

单个表中的多种基本文件格式

  • • 在单个 Hudi 表中支持多种基本文件格式(例如 Parquet、ORC、HFile),从而允许为索引和 ML 应用程序等特定使用案例定制格式。

  • • 当用户想要从一种文件格式切换到另一种文件格式时,例如从 ORC 切换到 Parquet,而无需重写整个表格。

  • • 配置:使用 Enable 启用hoodie.table.multiple.base.file.formats.enable.

要了解有关格式更改的更多信息,请参阅 Hudi 1.0 技术规范[11]。

API 变更

1.0.0 引入了几项 API 变更,包括:

记录合并 API

HoodieRecordPayload接口已被弃用,取而代之的是新的HoodieRecordMerger接口。记录合并是一个通用接口,允许用户定义用于合并基本文件和日志文件记录的自定义逻辑。此版本提供了一些开箱即用的合并模式,这些模式定义了基文件和日志文件在文件切片中的排序方式,以及如何一致地合并该文件切片中具有相同记录键的不同记录,以便为快照查询、写入器和表服务生成相同的确定性结果。具体来说,支持三种合并模式作为表级配置:

  • COMMIT_TIME_ORDERING:合并只是选择属于最新写入 (提交时间) 的记录作为合并结果。

  • EVENT_TIME_ORDERING:合并会选择用户指定的排序或预组合字段上具有最高值的记录作为合并结果。

  • CUSTOM:用户可以提供自定义的合并实现,以便更好地控制合并逻辑。

注意:我们建议用户迁移并使用记录合并器 API,而不是编写新的有效负载实现。
使用 Filegroup Reader 进行位置合并
  • • 基于位置的合并:提供基于键的合并的替代方法,允许根据记录位置跳过页面。默认情况下,Spark 和 Hive 处于启用状态。

  • • 配置:使用hoodie.merge.use.record.positions=true激活位置合并。

新读取器在基于键的合并下,部分更新的性能提升令人印象深刻。对于大小为 1TB 的 MOR 表,具有 100 个分区,后续提交中有 80% 的随机更新,新读取器的快照查询速度提高了 5.7 倍,写入放大率降低了 70 倍

Flink 增强功能

  • • Lookup Joins:Flink 现在支持查找联接,从而支持使用外部数据源扩表。

  • • Partition Stats 索引支持:如上所述,Flink 现在支持分区统计信息,为流式工作负载带来高效的分区修剪。

  • • 非阻塞并发控制:NBCC 现在可用于 Flink 流式写入器,允许多流并发摄取而不会发生冲突。

引用链接

[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