Apache Hudi 0.15.0 版本发布

2024-07-04 14:59:55 浏览数 (2)

Apache Hudi 0.15.0 版本带来了增强的引擎集成、新功能和多个领域的改进。其中包括 Spark 3.5 和 Scala 2.13 支持、Flink 1.18 支持、更好的 Trino Hudi 原生连接器支持以及新引入的与 Hadoop 无关的存储和 I/O 抽象。我们鼓励用户在使用 0.15.0 版本之前查看下面的版本亮点[1]和迁移指南[2],了解相关模块和 API 更改[3]以及行为更改[4]。

迁移指南

此版本保留与 0.14.0 版本相同的表版本 (6),如果从 0.14.0 升级,则无需升级表版本。有一些模块和 API 更改以及行为更改,如下所述,用户在使用 0.15.0 版本之前应采取相应的操作。

如果从旧版本(0.14.0 之前)迁移,请按顺序查看每个旧版本的升级说明。

Bundle包更新

新的 Spark Bundle 包

我们通过两个新 Bundle 包扩展了对 Spark 3.5 的 Hudi 支持:

  • • Spark 3.5 和 Scala 2.12:hudi-spark3.5-bundle_2.12[5]
  • • Spark 3.5 和 Scala 2.13:hudi-spark3.5-bundle_2.13[6]
Scala 2.13 的新实用程序包

除了为 Spark 3.5 和 Scala 2.13 添加 Bundle 包外,我们还添加了新的实用程序 Bundle 包以用于 Scala 2.13、hudi-utilities-bundle_2.13[7] 和 hudi-utilities-slim-bundle_2.13[8]。

新的和已弃用的 Flink Bundle包

我们通过一个新的Bundle包 hudi-flink1.18-bundle[9] 扩展了对 Flink 1.18 的 Hudi 支持。该版本删除了 Flink 1.13 对 Hudi 的支持。

模块和 API 更改

Hudi 存储和 I/O 抽象

此版本引入了与 Hadoop 无关的新存储和 I/O 抽象,以改进与查询引擎的集成,包括 Trino,它使用自己的本机文件系统 API。核心 Hudi 类(包括 HoodieTableMetaClient 、 HoodieBaseFile 、 HoodieLogFile 、 HoodieEngineContext 等)现在依赖于新的存储和 I/O 类。如果直接在应用程序中使用这些类,则需要更改集成代码和用法。有关更多详细信息,请查看此部分[10]。

模块更改

作为引入新的存储和 I/O 抽象并使核心读取器逻辑与 Hadoop 无关的一部分,此版本重构了 Hudi 模块以清楚地反映分层。具体说来

  • • hudi-io 添加了用于 I/O 相关功能的模块,Hudi 原生 HFile 读取器实现位于此新模块中;
  • • hudi-common 模块包含 Apache Hudi 技术规范的核心实现,现在独立于 Hadoop;
  • • hudi-hadoop-common 模块包含基于 Hadoop 文件系统 API 的实现,可与 Spark、Flink、Hive 和 Presto 等引擎上的模块一起 hudi-common 使用。

如果之前使用 hudi-common module 作为依赖项,而 Hadoop 文件系统 API 和实现则现在应包含所有三个模块 hudi-io 、 hudi-common 和 hudi-hadoop-common 和 作为依赖项。请注意,Presto 和 Trino 将基于 Hudi 0.15.0 版本发布,并进行此类更改。

锁定提供程序 API 更改

LockProvider 实例化现在需要实例 StorageConfiguration 作为构造函数的第二个参数。如果之前扩展 LockProvider 为实现自定义锁提供程序,则需要更改构造函数以匹配上述构造函数签名。下面是一个示例:

代码语言:javascript复制
public classXYZLockProviderimplementsLo   ckProvider<String>,Serializable{
...

publicXYZLockProvider(final LockConfiguration lockConfiguration, final StorageConfiguration<?> conf){
...
}

...
}

行为更改

改善Clean表服务

我们改进了默认的清理程序行为,仅在没有inflight计划中时才安排新的清理程序计划,方法是将hoodie.clean.allow.multiple[11]默认值从 true 翻转到 false 。这简化了启用元数据表时的清理表服务。该配置现已弃用,并将在下一个版本后删除。

允许在插入时重复

现在我们默认允许在操作时 INSERT 使用重复键,即使将插入路由为与现有文件合并(以确保文件大小),也可以将hoodie.merge.allow.duplicate.on.inserts默认值从 false 翻转到 true 。这仅与 INSERT 操作相关,因为 UPSERT 和 DELETE 操作始终确保唯一的键约束。

将 MOR 快照同步到元存储

为了更好地支持对 OLAP 引擎上的 MOR 表的快照查询,默认情况下,MOR 快照或 RT 会使用表名同步到元存储,方法是将hoodie.meta.sync.sync_snapshot_with_table_name默认值从 false 翻转到 true

Flink Option 默认翻转

默认值 read.streaming.skip_clustering 为 false 在此版本之前,这可能会导致 Flink 流式读取读取被替换的聚簇文件切片和重复数据的情况(与 read.streaming.skip_compaction情况类似), 0.15.0 版本通过将默认的 read.streaming.skip_clusteringread.streaming.skip_compaction 翻转到 true ,使 Flink 流式处理在所有情况下都跳过聚簇和压缩瞬间,以避免读取相关文件切片。

版本亮点

Hudi 存储和 I/O 抽象

为了提供更好的与查询引擎(包括使用原生的文件系统 API 的 Trino)的集成体验,此版本引入了与 Hadoop 无关的新存储和 I/O 抽象。具体来说,该版本引入了 Hudi 存储抽象 HoodieStorage ,它提供了所有 I/O API 来读取和写入存储上的文件和目录,例如 open 、 read 等。此类可以扩展以实现存储层优化,例如缓存、联合存储布局、热/冷存储分离等。此类需要基于特定系统实现,例如 Hadoop FileSystem 和 Trino TrinoFileSystem 的 。引入了用于访问文件系统的核心类:

  • StoragePath :表示存储上文件或目录的路径,它取代了 Hadoop Path
  • StoragePathInfo :保留 Hudi 使用的路径、长度、isDirectory、修改时间等信息,取代了 Hadoop FileStatus
  • StorageConfiguration :通过包装相应文件系统使用的特定配置类对象来提供存储配置。

引入抽象 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.classhoodie.io.factory.class 存储配置。

引擎支持

Spark 3.5 和 Scala 2.13 支持

此版本添加了对 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 支持

该版本添加了对 Flink 1.18 的支持,并添加了新的编译 maven 配置文件 flink1.18 和新的 Flink bundle hudi-flink1.18-bundle。

Hudi-Native HFile 读取器

Hudi 使用 HFile 格式作为基本文件格式,用于在元数据表 (MDT) 中存储各种元数据,例如文件列表、列统计信息和布隆过滤器,因为 HFile 格式针对范围扫描和点查找进行了优化。HFile 格式最初由 HBase 设计和实现。为了避免 HBase 依赖冲突,并通过独立于 Hadoop 的实现轻松实现引擎集成,我们在 Java 中实现了一个新的 HFile 读取器,它独立于 HBase 或 Hadoop 依赖项。此 HFile 读取器向后兼容现有的 Hudi 版本和存储格式。我们还编写了一个 HFile 格式规范,它定义了 Hudi 所需的 HFile 格式。这使得HFile读取器和写入器通过遵循此规范实现在任何语言中成为可能,例如,C 或Rust。

Hudi Utilities 中的新功能

StreamContext 和 SourceProfile 接口

对于 Hudi Streamer,我们引入了新的 StreamContextSourceProfile 接口。这些旨在包含有关如何在 StreamSync 的下一轮同步中从源使用数据并写入(例如,并行性)的详细信息。这允许用户控制源读取和数据写入目标 Hudi 表的行为和性能。

增强的 Proto Kafka 源代码支持

我们添加了对使用 Confluent 原型反序列化器进行反序列化的支持,通过新配置 hoodie.streamer.source.kafka.proto.value.deserializer.class 来指定 Kafka Proto 有效负载反序列化器类。

忽略 Hudi Streamer 中的检查点

Hudi streamer 有一个新选项, --ignore-checkpoint 可以忽略源的最后一个提交检查点。此选项应按照建议使用唯一值、时间戳值或 UUID 进行设置。设置此配置表示后续同步应忽略源的最后一个提交检查点。配置值存储在提交历史记录中,因此使用相同的值设置配置不会产生任何影响。此配置可用于 kafka 主题更改等场景,在这些场景中,我们希望在切换主题后从最新或最早的偏移量开始引入(在这种情况下,我们希望忽略先前提交的检查点,并依赖其他配置来选择起始偏移量)。

Meta Sync 改进

Glue Catalog Sync 中的并行列表

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 同步优化

现在如果启用了元数据表,BigQuery Sync 会从元数据表加载一次所有分区,以提高文件列表性能。

向 M3 报告指标

添加了新的 MetricsReporter 实现 M3MetricsReporter ,以支持向 M3 报告指标。用户现在可以通过在 hoodie.metrics.m3.host 和 hoodie.metrics.m3.port 中设置 hoodie.metrics.reporter.type 为 M3 及其相应的主机地址和端口来启用向 M3 报告指标。

其他功能和改进

Schema异常分类

该版本引入了 schema 相关异常的分类 (HUDI-7486[13]),以便用户轻松了解根本原因,包括由于非法 schema 将记录从 Avro 转换为 Spark Row 时出现的错误,或者记录与提供的 schema 不兼容。

记录大小估计改进

通过额外考虑替换提交和增量提交,改进了 Hudi 中的记录大小估计 (HUDI-7429[14])。

为 Athena 使用 S3 Scheme

最近的 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)

0 人点赞