问题导读:
1、Deltastreamer 终止策略是什么?
2、在Spark对接方面有哪些优化?
3、Flink对接方面有哪些优化?
4、迁移指南有哪些新变化?
Presto-Hudi 连接器
从 PrestoDB 0.275 版本开始,用户现在可以利用原生 Hudi 连接器来查询 Hudi 表。它与 Hive 连接器中的 Hudi 支持相当。要了解有关连接器使用的更多信息,请查看 prestodb 文档[1]。
存档点以外的存档
Hudi 支持保存点和恢复功能,这对备份和灾难恢复场景很有用。更多信息查看这里[2]。在 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[3]。用户可以随意实施他们认为合适的策略。
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更新[4]。
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更新[5]。
Flink 集成改进
- 批处理模式读取支持数据跳过,设置 SQL 选项 metadata.enabled、hoodie.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 工作负载进行了基准测试。请查看我们的博客[6]了解更多详情。
迁移指南
在此版本中,下面列出了一些 API 和配置更新,这些更新保证了新的表格版本。因此,最新的表版本[7]是 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
作者:ApacheHudi
来源:https://mp.weixin.qq.com/s/M09TkcojE2uHplMEiiSOnA
最新经典文章,欢迎关注公众号
|