此版本保留与 0.14.0 版本相同的表版本 (6),如果从 0.14.0 升级,则无需升级表版本。有一些模块和 API 更改以及行为更改,如下所述,用户在使用 0.15.0 版本之前应采取相应的操作。
如果从旧版本(0.14.0 之前)迁移,请按顺序查看每个旧版本的升级说明。
我们通过两个新 Bundle 包扩展了对 Spark 3.5 的 Hudi 支持:
除了为 Spark 3.5 和 Scala 2.13 添加 Bundle 包外,我们还添加了新的实用程序 Bundle 包以用于 Scala 2.13、hudi-utilities-bundle_2.13[7] 和 hudi-utilities-slim-bundle_2.13[8]。
我们通过一个新的Bundle包 hudi-flink1.18-bundle[9] 扩展了对 Flink 1.18 的 Hudi 支持。该版本删除了 Flink 1.13 对 Hudi 的支持。
此版本引入了与 Hadoop 无关的新存储和 I/O 抽象,以改进与查询引擎的集成,包括 Trino,它使用自己的本机文件系统 API。核心 Hudi 类(包括 HoodieTableMetaClient 、 HoodieBaseFile 、 HoodieLogFile 、 HoodieEngineContext 等)现在依赖于新的存储和 I/O 类。如果直接在应用程序中使用这些类,则需要更改集成代码和用法。有关更多详细信息,请查看此部分[10]。
作为引入新的存储和 I/O 抽象并使核心读取器逻辑与 Hadoop 无关的一部分,此版本重构了 Hudi 模块以清楚地反映分层。具体说来
如果之前使用 hudi-common
module 作为依赖项,而 Hadoop 文件系统 API 和实现则现在应包含所有三个模块 hudi-io 、 hudi-common 和 hudi-hadoop-common 和 作为依赖项。请注意,Presto 和 Trino 将基于 Hudi 0.15.0 版本发布,并进行此类更改。
LockProvider 实例化现在需要实例 StorageConfiguration 作为构造函数的第二个参数。如果之前扩展 LockProvider 为实现自定义锁提供程序,则需要更改构造函数以匹配上述构造函数签名。下面是一个示例:
public classXYZLockProviderimplementsLo ckProvider<String>,Serializable{
...
publicXYZLockProvider(final LockConfiguration lockConfiguration, final StorageConfiguration<?> conf){
...
}
...
}
我们改进了默认的清理程序行为,仅在没有inflight计划中时才安排新的清理程序计划,方法是将hoodie.clean.allow.multiple
[11]默认值从 true 翻转到 false 。这简化了启用元数据表时的清理表服务。该配置现已弃用,并将在下一个版本后删除。
现在我们默认允许在操作时 INSERT 使用重复键,即使将插入路由为与现有文件合并(以确保文件大小),也可以将hoodie.merge.allow.duplicate.on.inserts
默认值从 false 翻转到 true 。这仅与 INSERT 操作相关,因为 UPSERT 和 DELETE 操作始终确保唯一的键约束。
为了更好地支持对 OLAP 引擎上的 MOR 表的快照查询,默认情况下,MOR 快照或 RT 会使用表名同步到元存储,方法是将hoodie.meta.sync.sync_snapshot_with_table_name
默认值从 false 翻转到 true
默认值 read.streaming.skip_clustering
为 false 在此版本之前,这可能会导致 Flink 流式读取读取被替换的聚簇文件切片和重复数据的情况(与 read.streaming.skip_compaction
情况类似), 0.15.0 版本通过将默认的 read.streaming.skip_clustering
和 read.streaming.skip_compaction
翻转到 true ,使 Flink 流式处理在所有情况下都跳过聚簇和压缩瞬间,以避免读取相关文件切片。
为了提供更好的与查询引擎(包括使用原生的文件系统 API 的 Trino)的集成体验,此版本引入了与 Hadoop 无关的新存储和 I/O 抽象。具体来说,该版本引入了 Hudi 存储抽象 HoodieStorage ,它提供了所有 I/O API 来读取和写入存储上的文件和目录,例如 open 、 read 等。此类可以扩展以实现存储层优化,例如缓存、联合存储布局、热/冷存储分离等。此类需要基于特定系统实现,例如 Hadoop FileSystem 和 Trino TrinoFileSystem 的 。引入了用于访问文件系统的核心类:
StoragePath
:表示存储上文件或目录的路径,它取代了 Hadoop PathStoragePathInfo
:保留 Hudi 使用的路径、长度、isDirectory、修改时间等信息,取代了 Hadoop FileStatusStorageConfiguration
:通过包装相应文件系统使用的特定配置类对象来提供存储配置。引入抽象 HoodieIOFactory 是为了提供 API 来为 I/O 创建读取器和写入器,而无需依赖 Hadoop 类。通过使用新的存储和 I/O 抽象,我们在此版本中使 Hudi Hadoop 中的 hudi-common 模块和核心读取器逻辑独立于此版本。我们引入了一个新 hudi-hadoop-common 模块,其中包含基于Hadoop的文件系统API和实现的实现 HoodieStorage HoodieIOFactory ,以及依赖于Hadoop的API的现有读取器和写入器逻辑。该 hudi-hadoop-common 模块由 Spark、Flink、Hive 和 Presto 集成使用,其中逻辑保持不变。对于独立于Hadoop的引擎,集成应使用 hudi-common 模块并插入其自己的实现, HoodieStorage 并通过 HoodieIOFactory 设置新配置 hoodie.storage.class
和 hoodie.io.factory.class
存储配置。
此版本添加了对 Spark 3.5 的支持和 Scala 2.13 的支持;使用 Spark 3.5 的用户可以使用基于 Scala 版本的新 Spark Bundle包:hudi-spark3.5-bundle_2.12 和 hudi-spark3.5-bundle_2.13。此版本继续支持 Spark 3.4、3.3、3.2、3.1、3.0 和 2.4。要快速开始使用 Hudi 和 Spark 3.5,可以浏览我们的快速入门指南[12]。
该版本添加了对 Flink 1.18 的支持,并添加了新的编译 maven 配置文件 flink1.18 和新的 Flink bundle hudi-flink1.18-bundle。
Hudi 使用 HFile 格式作为基本文件格式,用于在元数据表 (MDT) 中存储各种元数据,例如文件列表、列统计信息和布隆过滤器,因为 HFile 格式针对范围扫描和点查找进行了优化。HFile 格式最初由 HBase 设计和实现。为了避免 HBase 依赖冲突,并通过独立于 Hadoop 的实现轻松实现引擎集成,我们在 Java 中实现了一个新的 HFile 读取器,它独立于 HBase 或 Hadoop 依赖项。此 HFile 读取器向后兼容现有的 Hudi 版本和存储格式。我们还编写了一个 HFile 格式规范,它定义了 Hudi 所需的 HFile 格式。这使得HFile读取器和写入器通过遵循此规范实现在任何语言中成为可能,例如,C++或Rust。
对于 Hudi Streamer,我们引入了新的 StreamContext
和 SourceProfile
接口。这些旨在包含有关如何在 StreamSync 的下一轮同步中从源使用数据并写入(例如,并行性)的详细信息。这允许用户控制源读取和数据写入目标 Hudi 表的行为和性能。
我们添加了对使用 Confluent 原型反序列化器进行反序列化的支持,通过新配置 hoodie.streamer.source.kafka.proto.value.deserializer.class
来指定 Kafka Proto 有效负载反序列化器类。
Hudi streamer 有一个新选项, --ignore-checkpoint
可以忽略源的最后一个提交检查点。此选项应按照建议使用唯一值、时间戳值或 UUID 进行设置。设置此配置表示后续同步应忽略源的最后一个提交检查点。配置值存储在提交历史记录中,因此使用相同的值设置配置不会产生任何影响。此配置可用于 kafka 主题更改等场景,在这些场景中,我们希望在切换主题后从最新或最早的偏移量开始引入(在这种情况下,我们希望忽略先前提交的检查点,并依赖其他配置来选择起始偏移量)。
AWS Glue Catalog 同步现在支持并行列出分区,以提高列表性能并减少元同步延迟。添加了三个新配置来控制列表并行性:
hoodie.datasource.meta.sync.glue.all_partitions_read_parallelism
:列出所有分区的并行性(首次同步)。hoodie.datasource.meta.sync.glue.changed_partitions_read_parallelism
:列出更改的分区(第二次和后续同步)的并行性。hoodie.datasource.meta.sync.glue.partition_change_parallelism
:更改操作(如创建、更新和删除)的并行性。现在如果启用了元数据表,BigQuery Sync 会从元数据表加载一次所有分区,以提高文件列表性能。
添加了新的 MetricsReporter 实现 M3MetricsReporter ,以支持向 M3 报告指标。用户现在可以通过在 hoodie.metrics.m3.host 和 hoodie.metrics.m3.port 中设置 hoodie.metrics.reporter.type 为 M3 及其相应的主机地址和端口来启用向 M3 报告指标。
该版本引入了 schema 相关异常的分类 (HUDI-7486[13]),以便用户轻松了解根本原因,包括由于非法 schema 将记录从 Avro 转换为 Spark Row 时出现的错误,或者记录与提供的 schema 不兼容。
通过额外考虑替换提交和增量提交,改进了 Hudi 中的记录大小估计 (HUDI-7429[14])。
最近的 Athena 版本在分区位置有 s3a
方案时静默删除 Hudi 数据。使用分区 s3 方案重新创建表可解决此问题。我们添加了 AWS Glue Catalog 同步 (HUDI-7362[15]) 中 Hudi 表分区使用 s3 方案的修复。
[1]
版本亮点: [https://hudi.apache.org/releases/release-0.15.0/#release-highlights](https://hudi.apache.org/releases/release-0.15.0/#release-highlights)
[2]
迁移指南: [https://hudi.apache.org/releases/release-0.15.0/#migration-guide-overview](https://hudi.apache.org/releases/release-0.15.0/#migration-guide-overview)
[3]
模块和 API 更改: [https://hudi.apache.org/releases/release-0.15.0/#module-and-api-changes](https://hudi.apache.org/releases/release-0.15.0/#module-and-api-changes)
[4]
行为更改: [https://hudi.apache.org/releases/release-0.15.0/#behavior-changes](https://hudi.apache.org/releases/release-0.15.0/#behavior-changes)
[5]
hudi-spark3.5-bundle_2.12: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-spark3.5-bundle_2.12](https://mvnrepository.com/artifact/org.apache.hudi/hudi-spark3.5-bundle_2.12)
[6]
hudi-spark3.5-bundle_2.13: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-spark3.5-bundle_2.13](https://mvnrepository.com/artifact/org.apache.hudi/hudi-spark3.5-bundle_2.13)
[7]
hudi-utilities-bundle_2.13: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-utilities-bundle_2.13](https://mvnrepository.com/artifact/org.apache.hudi/hudi-utilities-bundle_2.13)
[8]
hudi-utilities-slim-bundle_2.13: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-utilities-slim-bundle_2.13](https://mvnrepository.com/artifact/org.apache.hudi/hudi-utilities-slim-bundle_2.13)
[9]
hudi-flink1.18-bundle: [https://mvnrepository.com/artifact/org.apache.hudi/hudi-flink1.18-bundle](https://mvnrepository.com/artifact/org.apache.hudi/hudi-flink1.18-bundle)
[10]
此部分: [https://hudi.apache.org/releases/release-0.15.0/#hudi-storage-and-io-abstractions-1](https://hudi.apache.org/releases/release-0.15.0/#hudi-storage-and-io-abstractions-1)
[11]
hoodie.clean.allow.multiple
: [https://hudi.apache.org/docs/configurations#hoodiecleanallowmultiple](https://hudi.apache.org/docs/configurations#hoodiecleanallowmultiple)
[12]
快速入门指南: [https://hudi.apache.org/docs/quick-start-guide](https://hudi.apache.org/docs/quick-start-guide)
[13]
HUDI-7486: [https://issues.apache.org/jira/browse/HUDI-7486](https://issues.apache.org/jira/browse/HUDI-7486)
[14]
HUDI-7429: [https://issues.apache.org/jira/browse/HUDI-7429](https://issues.apache.org/jira/browse/HUDI-7429)
[15]
HUDI-7362: [https://issues.apache.org/jira/browse/HUDI-7362](https://issues.apache.org/jira/browse/HUDI-7362)