下载信息
-
源码地址: Apache Hudi 源码
-
版本相关jar包: here
版本迁移指南
-
如果从旧版本进行迁移,还请检查下面每个后续版本的升级说明
-
在0.9.0中,Hudi添加了更多的表属性,以帮助在现有的Hudi表使用spark-sql。为了顺利地帮助这种过渡,这些属性添加到
hoodie.properties
文件上。每当使用更新的表版本(即2)启动Hudi时(或从pre 0.9.0移动到0.9.0),都会自动执行升级步骤。这个自动升级步骤只会在每个Hudi表中发生一次,因为hoodie.table.version
将在升级完成后在属性文件中更新。 -
类似地,还添加了一个用于降级的命令行工具(command-
downgrade
),因为可能有些用户想要将Hudi从表版本2
降级到表版本1
,或者从Hudi 0.9.0移动到0.9.0之前。这需要从0.9.0的hudi-cli
二进制/脚本执行。 -
在这个版本中,我们添加了一个新的框架来跟踪代码中的配置属性,不再使用包含属性名和值的字符串变量。这一举动帮助我们自动化配置文档的生成等等。虽然我们仍然支持旧的configs字符串变量,但鼓励用户使用新的
ConfigProperty
等价项,具体如弃用说明中所述。在大多数情况下,就像在相应的替代上调用.key()
和.defaultvalue()
一样简单。例如:RECORDKEY_FIELD_OPT_KEY
可以被RECORDKEY_FIELD_NAME.key()
替换。
版本亮点
Spark SQL DDL/DML支持
Apache Hudi 0.9.0实验性地支持使用Spark SQL进行DDL/DML操作,朝着让所有用户(非工程师、分析师等)更容易访问和操作Hudi迈出了一大步。用户可以直接使用CREATE TABLE ... USING HUDI
以及CREATE TABLE ... AS SELECT
语法来在像Hive的catalogs中创建和管理表。用户然后可以使用INSERT
,UPDATE
, MERGE INTO
以及DELETE
sql语法来操纵数据。除此之外,INSERT OVERWRITE
语句可用于覆盖表或分区中现有的批处理ETL管道中的现有数据。更多信息,点击SparkSQL选项卡查看我们的文档。请参阅RFC-25了解更多实现细节。
查询方面的改进
Hudi表现在在Hive中注册为spark数据源表,这意味着这些表上的spark SQL现在也使用数据源,而不是依赖于spark中的Hive fallbacks,这是很难维护/也是很麻烦的。这开启了许多优化,比如使用Hudi自己的FileIndex实现来优化缓存,以及使用Hudi元数据表来更快地列出大型表。对于spark数据源,我们还增加了对timetravel查询的支持。
写方面的改进
添加了虚拟键支持,用户可以避免将元字段添加到 Hudi 表并利用现有的字段来填充记录键和分区路径。请参考 具体配置[4]来开启虚拟键。
Clustering改进
DeltaStreamer 和 Spark Streaming 都添加了异步Clustering支持。可以在这篇博客文章[5]中找到更多细节。
增量读取也适用于Clustering数据。
添加了HoodieClusteringJob[6]以作为独立作业来构建和执行Clustering计划。
添加了一个配置(hoodie.clustering.plan.strategy.daybased.skipfromlatest.partitions
)以在创建Clustering计划时跳过最近的 N 个分区。
增强 Bulk_Insert模式(新增行写入器模式),并缺省打开,用户可以使用行写入器模式以获得更好的性能。
在 HiveSyncTool 中添加了对 HMS 的支持。HMSDDLExecutor 是一个 DDLExecutor 实现,基于使用 HMS 的 HMS apis 直接用于执行所有 DDL 。
Spark 引擎中添加了预提交验证器框架[7]。用户可以利用该框架来添加验证给定提交的文件是否都存在,或是否已经删除所有无效文件等。
org.apache.hudi.client.validator.SqlQueryEqualityPreCommitValidator[8]可用于验证提交前后行的数据行相同
org.apache.hudi.client.validator.SqlQueryInequalityPreCommitValidator[9]可用于验证提交前后的数据行不相同
org.apache.hudi.client.validator.SqlQuerySingleResultPreCommitValidator[10]可用于验证表是否产生特定值这些可以通过设置hoodie.precommit.validators=<逗号分隔的验证器类名称列表> 来配置
。用户还可以通过扩展抽象类 SparkPreCommitValidator
并覆盖此方法来提供自己的实现。
用户可以选择删除用于生成分区路径的字段(hoodie.datasource.write.drop.partition.columns
),以支持使用BigQuery系统查询Hudi快照。
支持华为云、百度云、金山云对象存储。
添加了对delete_partition
操作的支持,用户可以在需要时利用它删除旧分区。
ORC格式支持,现在用户可以指定存储格式为ORC,注意现在暂时只支持Spark查询。
Hudi 使用不同类型的可溢出映射,用于内部处理合并(压缩、更新甚至 MOR 快照查询)。在 0.9.0 中,我们添加了对 bitcask默认选项的压缩支持,并引入了由 RocksDB 支持,它可以在大批量更新或处理大型基本文件时性能更高。
增强对未提交的数据的自动清理,该增强在云存储上性能更优,具体来说是新增了一种新的标记机制,利用时间线服务器对底层存储执行集中协调的文件标记批量读/写,你可以使用这个配置[11]来启用,并在这个博客[12]上了解更多。
DeltaStreamer的改进
JDBC Source[13]可以采用提取 SQL 语句并从支持 JDBC 的源中增量获取数据。这对于例如从 RDBMS 源读取数据时很有用。请注意,这种方法可能需要定期重新引导以确保数据一致性,尽管在基于 CDC 的方法上操作要简单得多。
SQLSource[14]使用 Spark SQL 语句从现有表中提取数据,对于基于 SQL 的简单回填用例非常有用,例如:过去 N 个月只回填一列。
S3EventsHoodieIncrSource[15]和S3EventsSource[16]有助于从 S3 读取数据,可靠且高效地将数据摄取到 Hudi。现有使用 DFSSource 的方法是使用文件的最后修改时间作为检查点来拉入新文件,但是如果大量文件具有相同的修改时间,则可能会遇到丢失一些要从源读取的文件的问题。这两个源(S3EventsHoodieIncrSource 和 S3EventsSource)通过利用从源存储桶订阅文件事件的 AWS SNS 和 SQS 服务,共同确保将数据从 S3 可靠地摄取到 Hudi。
除了使用 DeltaStreamer 使用常规偏移格式(topic_name,partition_num:offset,partition_num:offset,….),我们还为 kafka 源提取数据添加了两种新格式,即基于时间戳和组消费者偏移量。添加了在 deltastreamer 中使用模式提供程序在模式注册表提供程序 url 中传递基本身份验证凭据的支持。对hudi-cli
的一些改进,例如SCHEDULE COMPACTION
和RUN COMPACTION
语句,以便轻松在 Hudi 表上调度和运行Compaction、Clustering。
Flink集成
Flink写入支持CDC Format
的 MOR 表,打开选项changelog.enabled
时,Hudi 会持久化每条记录的所有更改标志,使用 Flink 的流读取器,用户可以根据这些更改日志进行有状态的计算。请注意当使用异步压缩时,所有中间更改都合并为一个(最后一条记录),仅具有 UPSERT 语义。
支持Bulk insert来加载现有表,可以将write.operation
设置为bulk_insert
来使用。
Flink支持流式读取 COW 表。
删除消息默认在流式读取模式下发出,当changelog.enabled
为false
时,下游接收DELETE
消息作为带有空负载的 Hudi 记录。
Flink写入现在可以更新历史分区,即删除历史分区中的旧记录然后在当前分区插入新记录,打开index.global.enabled
使用。
通过支持不同的 Hive 版本(1.x、2.x、3.x),大大改善了 Hive 同步。
Flink 支持纯日志追加模式,在这种模式下没有记录去重,对于COW
和MOR
表,每次刷新都直接写入 parquet,关闭write.insert.deduplicate
以开启这种模式。
本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://lrting.top/backend/2037/