Apache Hudi 0.12.0版本发布

Posted YoungerChina

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Hudi 0.12.0版本发布相关的知识,希望对你有一定的参考价值。

Presto-Hudi 连接器

从 PrestoDB 0.275 版本开始,用户现在可以利用原生 Hudi 连接器来查询 Hudi 表。它与 Hive 连接器中的 Hudi 支持相当。要了解有关连接器使用的更多信息,请查看 prestodb 文档

存档点以外的存档

Hudi 支持保存点和恢复功能,这对备份和灾难恢复场景很有用。更多信息查看这里。在 0.12.0 之前,给定表的归档在第一次保存点提交之后就无法再次提交,但是社区已经要求放宽这个限制,以便可以在活动时间线中保留一些粗粒度的提交并执行时间点查询。因此在 0.12.0 中用户现在可以通过启用 hoodie.archive.beyond.savepoint写入配置,让存档在保存点提交之后继续进行,这为 Hudi 用户开启了新的机遇。例如通过每天为较旧的提交添加一个保存点(假设 > 30 天),可以将提交保留多年。并使用as.of.instant和任何较旧的保存点提交查询 hudi 表。这样 Hudi 不需要在活动时间线中为较旧的提交保留每个提交。

注意:如果启用此功能,则无法支持还原。 此限制将在未来的版本中放宽,可以在 HUDI-4500 中跟踪此功能的开发。

基于文件系统的锁

对于使用乐观并发控制的多个写入器,Hudi 已经支持基于Zookeeper、Hive Metastore 或 Amazon DynamoDB。 在0.12.0版本中,新添加基于文件系统的锁。 不像需要其他锁提供者中的外部系统,此实现基于原子获取/释放锁底层文件系统的创建/删除操作。 要使用此锁,用户需要设置以下配置

hoodie.write.concurrency.mode=optimistic_concurrency_control
hoodie.write.lock.provider=org.apache.hudi.client.transaction.lock.FileSystemBasedLockProvider

Deltastreamer 终止策略

用户现在可以使用 deltastreamer 连续模式配置写入后终止策略。例如如果连续 5 次没有来自源的新数据,用户可以配置优雅关闭。这是终止策略的接口。

/**
 * Post write termination strategy for deltastreamer in continuous mode.
 */
public interface PostWriteTerminationStrategy 

  /**
   * Returns whether deltastreamer needs to be shutdown.
   * @param scheduledCompactionInstantAndWriteStatuses optional pair of scheduled compaction instant and write statuses.
   * @return true if deltastreamer has to be shutdown. false otherwise.
   */
  boolean shouldShutdown(Option<Pair<Option<String>, JavaRDD<WriteStatus>>> scheduledCompactionInstantAndWriteStatuses);

这可能有助于引导新表,与其做一个批量加载或bulk_insert,利用大型集群写入大量数据,不如在所有数据都被引导后,在连续模式下启动deltastreamer并添加一个关闭策略来终止。 这样每个批次可以更小,并且可能不需要大型集群来引导数据,Hudi内置一个开箱即用的具体实现,NoNewDataTerminationStrategy。 用户可以随意实施他们认为合适的策略。

Spark 3.3 支持

0.12.0添加了 Spark 3.3 支持,使用 Spark 3.3 的用户可以使用 hudi-spark3.3-bundle或 hudi-spark3-bundle。将继续支持 Spark 3.2、Spark 3.1 和 Spark 2.4。 请查看迁移指南以获取bundle更新

Spark SQL 支持改进

  • 通过调用Call Procedure支持升级、降级、引导、清理、回滚和修复。
  • 支持分析表。
  • 通过 Spark SQL 支持创建/删除/显示/刷新索引语法。

Flink 1.15 支持

Flink 1.15.x 与 Hudi 集成,编译代码时使用配置文件参数 -Pflink1.15 适配版本。 或者使用 hudi-flink1.15-bundle。Flink 1.14 和 Flink 1.13 将继续得到支持,请查看迁移指南以获取bundle更新

Flink 集成改进

  • 批处理模式读取支持数据跳过,设置 SQL 选项 metadata.enabledhoodie.metadata.index.column.stats.enable和 read.data.skipping.enabled为 true 以启用它。
  • 添加了一个基于 HMS 的 Flink 目录,目录标识符为 hudi。可以直接通过 API 实例化目录,也可以使用 CREATE CATALOG语法来创建它。指定目录选项 'mode' = 'hms'以切换到 HMS 目录。 默认情况下,目录处于 dfs模式。
  • Flink INSERT 操作支持异步Clustering,设置 SQL 选项 clustering.schedule.enabled和 clustering.async.enabled 为 true 以启用它。 启用此功能时将异步连续调度Clustering子管道,以将小文件连续合并为更大的文件。

性能改进

这个版本带来了更多的改进,使 Hudi 成为性能最好的湖存储格式。 一些显着的改进是:

  • 通过 Spark Datasource与 sql 缩小了写入的性能差距。 以前数据源写入速度更快。
  • 所有内置密钥生成器都实现了更高性能的 Spark 特定 API。
  • 将批量插入操作中的 UDF 替换为 RDD 转换以降低 serde 成本。
  • 优化了数据跳过中的列统计索引性能。

我们最近将 Hudi 与 TPC-DS 工作负载进行了基准测试。 请查看我们的博客了解更多详情。

迁移指南

在此版本中,下面列出了一些 API 和配置更新,这些更新保证了新的表格版本。 因此,最新的表版本是 5。对于旧版本的现有 Hudi 表,将自动执行一次性升级步骤。 在升级到 Hudi 0.12.0 之前,请注意以下更新。

配置更新

在此版本中,一些配置的默认值已更改。它们如下:

  • hoodie.bulkinsert.sort.mode:此配置用于确定批量插入记录的排序模式。它的默认值已从 GLOBAL_SORT 更改为 NONE,这意味着不进行排序,并且在开销方面与 spark.write.parquet() 匹配。
  • hoodie.datasource.hive_sync.partition_value_extractor:此配置用于在 Hive 同步期间提取和转换分区值。其默认值已从 SlashEncodedDayPartitionValueExtractor更改为 MultiPartKeysValueExtractor。如果您依赖之前的默认值(即没有明确设置),则需要将配置设置为 org.apache.hudi.hive.SlashEncodedDayPartitionValueExtractor。从此版本开始,如果未设置此配置并启用 Hive 同步,则将根据分区字段数以及是否启用 Hive 样式分区自动推断分区值提取器类。
  • 如果未手动设置,将从其他配置的值推断以下配置:
  • META_SYNC_BASE_FILE_FORMAT:从 org.apache.hudi.common.table.HoodieTableConfig.BASE_FILE_FORMAT 推断
  • META_SYNC_ASSUME_DATE_PARTITION:从 org.apache.hudi.common.config.HoodieMetadataConfig.ASSUME_DATE_PARTITIONING 推断
  • META_SYNC_DECODE_PARTITION:从 org.apache.hudi.common.table.HoodieTableConfig.URL_ENCODE_PARTITIONING 推断
  • META_SYNC_USE_FILE_LISTING_FROM_METADATA:从 org.apache.hudi.common.config.HoodieMetadataConfig.ENABLE 推断

API 更新

在 SparkKeyGeneratorInterface中,getRecordKeyAPI 的返回类型已从 String 更改为 UTF8String。

// Before
String getRecordKey(InternalRow row, StructType schema); 


// After
UTF8String getRecordKey(InternalRow row, StructType schema);

Fallback分区

如果分区字段值为 null,则 Hudi 具有回退机制,而不是使写入失败。 在 0.9.0 之前,__HIVE_DEFAULT_PARTITION__被用作备用分区。 在 0.9.0 之后,由于一些重构,fallback 分区更改为default分区,此默认分区不适用于某些查询引擎。 因此我们将备用分区从 0.12.0 切换到 __HIVE_DEFAULT_PARTITION__。 我们添加了一个升级步骤,如果现有的 Hudi 表有一个名为 default的分区,我们将无法升级。 用户应将此分区中的数据重写到名为 __HIVE_DEFAULT_PARTITION__分区中。 但是如果您有意将分区命名为默认分区,则可以使用配置 hoodie.skip.default.partition.validation绕过它。

Bundle更新

  • hudi-aws-bundle 从 hudi-utilities-bundle 或 hudi-spark-bundle 中提取与 aws 相关的依赖项。 为了使用 Glue 同步、Cloudwatch 指标报告器或 DynamoDB 锁提供程序等功能,用户需要提供 hudi-aws-bundle jar 以及 hudi-utilities-bundle 或 hudi-spark-bundle jar。
  • 添加了 Spark 3.3 支持; 使用 Spark 3.3 的用户可以使用 hudi-spark3.3-bundle 或 hudi-spark3-bundle(旧版包名称)。
  • Spark 3.2 将继续通过 hudi-spark3.2-bundle 支持
  • Spark 3.1 将继续通过 hudi-spark3.1-bundle 支持
  • Spark 2.4 将继续通过 hudi-spark2.4-bundle 或 hudi-spark-bundle(旧包名称)支持
  • 增加 Flink 1.15 支持; 使用 Flink 1.15 的用户可以使用 hudi-flink1.15-bundle
  • Flink 1.14 将继续通过 hudi-flink1.14-bundle 支持
  • Flink 1.13 将继续通过 hudi-flink1.13-bundle 支持

感谢

感谢参与0.12.0版本的所有贡献者,欢迎广大数据湖爱好者加入Apache Hudi社区,欢迎star & fork https://github.com/apache/hudi

以上是关于Apache Hudi 0.12.0版本发布的主要内容,如果未能解决你的问题,请参考以下文章

Flink 实战系列Flink SQL 实时同步 Kafka 数据到 Hudi(parquet + snappy)

Apache Hudi 0.5.1版本重磅发布

神探!Apache Hudi集成Prometheus/Pushgateway 进行监控

数据湖之Hudi:Apache Hudi 快速发展

真香!PySpark整合Apache Hudi实战

真香!PySpark整合Apache Hudi实战