小知识:Apache Hudi灵活的Payload机制硬核解析

1.摘要

apache hudipayload是一种可扩展的数据处理机制,通过不同的payload我们可以实现复杂场景的定制化数据写入方式,大大增加了数据处理的灵活性。hudi payload在写入和读取hudi表时对数据进行去重、过滤、合并等操作的工具类,通过使用参数 “hoodie.datasource.write.payload.class”指定我们需要使用的payload class。本文我们会深入探讨hudi payload的机制和不同payload的区别及使用场景。

2. 为何需要payload

在数据写入的时候,现有整行插入、整行覆盖的方式无法满足所有场景要求,写入的数据也会有一些定制化处理需求,因此需要有更加灵活的写入方式以及对写入数据进行一定的处理,hudi提供的playload方式可以很好的解决该问题,例如可以解决写入时数据去重问题,针对部分字段进行更新等等。

3. payload的作用机制

写入hudi表时需要指定一个参数hoodie.datasource.write.precombine.field,这个字段也称为precombine key,hudi payload就是根据这个指定的字段来处理数据,它将每条数据都构建成一个payload,因此数据间的比较就变成了payload之间的比较。只需要根据业务需求实现payload的比较方法,即可实现对数据的处理。

hudi所有payload都实现hoodierecordpayload接口,下面列出了所有实现该接口的预置payload类。

%小知识:Apache Hudi灵活的Payload机制硬核解析-猿站网-插图

下图列举了hoodierecordpayload接口需要实现的方法,这里有两个重要的方法precombine和combineandgetupdatevalue,下面我们对这两个方法进行分析。

%小知识:Apache Hudi灵活的Payload机制硬核解析-1猿站网-插图

3.1 precombine分析

从下图可以看出,该方法比较当前数据和oldvalue,然后返回一条记录。

%小知识:Apache Hudi灵活的Payload机制硬核解析-2猿站网-插图

从precombine方法的注释描述也可以知道首先它在多条相同主键的数据同时写入hudi时,用来进行数据去重。

调用位置

%小知识:Apache Hudi灵活的Payload机制硬核解析-3猿站网-插图

其实该方法还有另一个调用的地方,即在mor表读取时会对log file中的相同主键的数据进行处理。

如果同一条数据多次修改并写入了mor表的log文件,在读取时也会进行precombine。

%小知识:Apache Hudi灵活的Payload机制硬核解析-4猿站网-插图

3.2 combineandgetupdatevalue分析

该方法将currentvalue(即现有parquet文件中的数据)与新数据进行对比,判断是否需要持久化新数据。

%小知识:Apache Hudi灵活的Payload机制硬核解析-5猿站网-插图

由于cow表和mor表的读写原理差异,因此combineandgetupdatevalue的调用在cow和mor中也有所不同:

在cow写入时会将新写入的数据与hudi表中存的currentvalue进行比较,返回需要持久化的数据

在mor读取时会将经过precombine处理的log中的数据与parquet文件中的数据进行比较,返回需要持久化的数据

4.常用payload处理逻辑的对比

了解了payload的内核原理,下面我们对比分析下集中常用的payload实现的方式。

4.1 overwritewithlatestavropayload

overwritewithlatestavropayload 的相关方法实现如下

%小知识:Apache Hudi灵活的Payload机制硬核解析-6猿站网-插图

可以看出使用overwritewithlatestavropayload 会根据orderingval进行选择(这里的orderingval即precombine key的值),而combineandgetupdatevalue永远返回新数据。

4.2 overwritenondefaultswithlatestavropayload

overwritenondefaultswithlatestavropayload继承overwritewithlatestavropayload,precombine方法相同,重写了combineandgetupdatevalue方法,新数据会按字段跟schema中的default value进行比较,如果default value非null且与新数据中的值不同时,则在新数据中更新该字段。由于通常schema定义的default value都是null,在此场景下可以实现更新非null字段的功能,即如果一条数据有五个字段,使用此payload更新三个字段时不会影响另外两个字段原来的值。

%小知识:Apache Hudi灵活的Payload机制硬核解析-7猿站网-插图

4.3 defaulthoodierecordpayload

defaulthoodierecordpayload同样继承overwritewithlatestavropayload重写了combineandgetupdatevalue方法,通过下面代码可以看出该payload使用precombine key对现有数据和新数据进行比较,判断是否要更新该条数据。

%小知识:Apache Hudi灵活的Payload机制硬核解析-8猿站网-插图

下面我们以cow表为例展示不同payload读写结果测试

5. 测试

我们使用如下几条源数据,以key为主键,col3为precombine key写hudi表。

%小知识:Apache Hudi灵活的Payload机制硬核解析-9猿站网-插图

首先我们一次写入col0是aa、bb的两条数据,由于他们的主键相同,所以在precombine时会根据col3比较去重,最终写入hudi表的只有一条数据。(注意如果写入方式是insert或bulk_insert则不会去重)

%小知识:Apache Hudi灵活的Payload机制硬核解析-10猿站网-插图

查询结果

%小知识:Apache Hudi灵活的Payload机制硬核解析-11猿站网-插图

下面我们使用col0是cc的数据进行更新,这是由于三种payload的处理逻辑不同,最终写入的数据结果也不同。

overwritewithlatestavropayload完全用新数据覆盖了旧数据。

%小知识:Apache Hudi灵活的Payload机制硬核解析-12猿站网-插图

overwritenondefaultswithlatestavropayload由于更新数据中col1 col2为null,因此该字段未被更新。

%小知识:Apache Hudi灵活的Payload机制硬核解析-13猿站网-插图

defaulthoodierecordpayload由于cc的col3小于bb的,因此该数据未被更新。

%小知识:Apache Hudi灵活的Payload机制硬核解析-14猿站网-插图

6. 总结

通过上面分析我们清楚了hudi常用的几种payload机制,总结对比如下

payload 更新逻辑与适用场景 overwritewithlatestavropayload 永远用新数据更新老数据全部字段,适合每次更新数据都是完整的 overwritenondefaultswithlatestavropayload 将新数据中的非空字段更新到老数据中,适合每次更新数据只有部分字段 defaulthoodierecordpayload 根据precombine key比较是否要更新数据,适合实时入湖且入湖顺序乱序

虽然hudi提供了多个预置payload,但是仍不能满足一些特殊场景的数据处理工作:例如用户在使用kafka-hudi实时入湖,但是用户的一条数据的修改不在一条kafka消息中,而是多条相同主键的数据消息到,第一条里面有col0,col1的数据,第二条有col2,col3的数据,第三条有col4的数据,这时使用hudi自带的payload就无法完成将这三条数据合并之后写入hudi表的工作,要实现这个逻辑就要通过自定义payload,重写payload中的precombine和combineandgetupdatevalue方法来实现相应的业务逻辑,并在写入时通过hoodie.datasource.write.payload.class指定我们自定义的payload实现

以上就是apache hudi灵活的payload机制硬核解析的详细内容,更多关于apache hudi payload机制解析的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/leesf456/p/16068688.html

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Apache Hudi性能提升三倍的查询优化

2023-3-10 15:58:31

建站知识

小知识:使用gradle打包上传jar并创建Nexus3x私有仓库步骤示例

2023-3-10 16:13:33

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索