在 Hudi 中可以根据业务场景为 Hudi 表配置负载类Payload,它用于在更新期间合并同一记录的两个版本。本文将深入了解有效负载类的用途以及可以使用的所有不同方式。

配置:hoodie.datasource.write.payload.class

注意:对于新的记录合并API ,这些可能会发生变化。 因此此有效负载类详细信息适用于 Hudi 0.13.0 之前的所有版本。 未来的版本可能会弃用这一点。

Payload类

Hudi 有一个有效负载类接口,它将确定如何将同一记录的两个版本合并在一起。

核心方法如下:

/**
* This methods lets you write custom merging/combining logic to produce new values as a function of current value on storage and whats contained
* in this object. Implementations can leverage properties if required.
* <p>
* eg:
* 1) You are updating counters, you may want to add counts to currentValue and write back updated counts
* 2) You may be reading DB redo logs, and merge them with current image for a database row on storage
* </p>
*
* @param currentValue Current value in storage, to merge/combine this payload with
* @param schema Schema used for record
* @param properties Payload related properties. For example pass the ordering field(s) name to extract from value in storage.
* @return new combined/merged value to be written back to storage. EMPTY to skip writing this record.
*/
Option<IndexedRecord> combineAndGetUpdateValue(IndexedRecord currentValue, Schema schema, Properties properties) throws IOException;

Hudi 在内部将一条记录表示为 HoodieRecord,它由一对 HoodieKey 和 HoodieRecordPayload 组成。 正如我们在之前的博客中看到的,HoodieKey 代表一条记录的主键(通常是分区路径和记录键)。 HoodieRecordPayload是用户实际传入的数据。

让我们来看一个典型的例子。 在 commit1 中摄取了 2 条记录,即 {HK1, payload1_1} 和 {HK2, payload2_1}。 在 commit2 中,假设摄取 {HK1, payload1_2} 和 {HK3, payload3_1}。

由于更新了 HK1,Hudi 将合并两个有效载荷(payload1_1 和 payload1_2 以产生 HK1 的最终输出。这就是上面显示的 combineAndGetUpdateValue() 发挥作用的地方。

本质上,HK1.payload1_2.combineAndGetUpdateValue(HK1.payload1_1) 在 commit2 结束时推导出 HK1 的最终值。

在这种情况下,让我们深入研究 Hudi 提供的一些有效负载实现。 默认负载类称为 OverwriteWithLatestAvroPayload。

OverwriteWithLatestAvroPayload

正如名称所暗示的那样,当使用此有效负载类时,我们只需使用新的传入值覆盖任何现有值。 因此,在上述示例中,一旦 commit2 完成,payload1_2 将成为 HK1 的最终值。 这是 Hudi 提供的最简单的有效负载,并且对社区中的大多数用户来说效果很好。

DefaultHoodieRecordPayload

我们还有一个名为 DefaultHoodieRecordPayload 的负载类。 与 Hudi 一开始就提供的 OverwriteWithLatestAvroPayload 相比,这个 DefaultHoodieRecordPayload 是在 1.5 年前引入的。 让我们深入了解一下这个负载类的特殊之处。

一般来说,Hudi表可以配置preCombine字段。 简而言之 preCombine 字段用于解决同一批次中同一记录的两个版本之间的优胜者。 例如,如果在写入 Hudi 时在同一批次中摄取 {HK1, payload1_1} 和 {HK1, payload1_2},Hudi 将在内部路由之前对传入记录进行去重。 因此在这种情况下,preCombine 字段值将决定多个版本中的获胜者。

例如可以在表schema中选择“updated_at”字段作为 preCombine 字段。 因此,如果传入批次中有超过 1 条具有相同 HoodieKey 的记录,则具有较高 preCombine 值的记录将优先。

尽管 OverwriteWithLatestAvroPayload 和 DefaultHoodieRecordPayload 可能看起来很相似,但有一个关键区别。 这是 combineAndGetUpdateValue() 的实现方式。 DefaultHoodieRecordPayload 在将传入记录与存储中的记录合并时也遵循 preCombine 值,而 OverwriteWithLatestAvroPayload 将盲目地选择传入而不是存储中的任何内容。

让我们添加带有插入记录(HK3,以及 HK1 的更新值)的 commit2。

OverwriteWithLatestAvroPayload 和 DefaultHoodieRecordPayload 都用 payload1_2 更新了 HK1。 OverwriteWithLatestAvroPayload 始终选择较新的传入,因此选择了 payload1_2。 DefaultHoodieRecordPayload 根据 preCombine 字段值推导。 由于 payload1_2 的预组合字段值(20)高于 payload1_1 的预组合字段值(10),DefaultHoodieRecordPayload 也选择 payload1_2 作为 HK1 的最终快照。

现在让我们使用 commit3,它使用较低的 preCombine 值更新 HK1 以模拟迟到的数据。

OverwriteWithLatestAvroPayload 选择新的传入有效负载而不考虑 preCombine 值,因此它选择 payload1_3 作为 HK1 的最终值。 但 DefaultHoodieRecordPayload 根据 preCombine 值选择最终获胜者,因此它选择 payload1_2 作为 HK1 的最终快照值。

社区有其他有效负载类供使用,如 OverwriteNonDefaultsWithLatestAvroPayloadAWSDmsAvroPayloadMySqlDebeziumAvroPayloadPostgresDebeziumAvroPayload 等。

还可以自定义合并两个版本的记录的负载类,为 lakehouse 用户提供了极大的灵活性。 如果不是 SparkSQL 写入(MERGE INTO),没有多少系统能给你这种灵活性,但 Hudi 用户从一开始就享受它

结论

因为不同用例的场景不同,Hudi 支持Payload方式提供灵活性,有效负载类就是这样一种设计,可以根据自己的需求定义自己的 Payload 类,而不是局限于 Hudi 提供的 Payload。 希望这篇博客有助于理解有效负载类的用途、常用的有效负载实现。

Apache Hudi 负载类Payload使用案例剖析的更多相关文章

  1. 超硬核解析!Apache Hudi灵活的Payload机制

    Apache Hudi 的Payload是一种可扩展的数据处理机制,通过不同的Payload我们可以实现复杂场景的定制化数据写入方式,大大增加了数据处理的灵活性.Hudi Payload在写入和读取H ...

  2. 写入Apache Hudi数据集

    这一节我们将介绍使用DeltaStreamer工具从外部源甚至其他Hudi数据集摄取新更改的方法, 以及通过使用Hudi数据源的upserts加快大型Spark作业的方法. 对于此类数据集,我们可以使 ...

  3. Apache Hadoop 2.9.2 的归档案例剖析

    Apache Hadoop 2.9.2 的归档案例剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   能看到这篇文章说明你对NameNode 工作原理是有深入的理解啦!我们知道 ...

  4. 基于Apache Hudi和Debezium构建CDC入湖管道

    从 Hudi v0.10.0 开始,我们很高兴地宣布推出适用于 Deltastreamer 的 Debezium 源,它提供从 Postgres 和 MySQL 数据库到数据湖的变更捕获数据 (CDC ...

  5. 直播 | Apache Kylin & Apache Hudi Meetup

    千呼万唤始出来,Meetup 直播终于来啦- 本次线上 Meetup 由 Apache Kylin 与 Apache Hudi 社区联合举办,将于 3 月 14 日晚进行直播,邀请到来自丁香园.腾讯. ...

  6. Apache Hudi 设计与架构最强解读

    感谢 Apache Hudi contributor:王祥虎 翻译&供稿. 欢迎关注微信公众号:ApacheHudi 本文将介绍Apache Hudi的基本概念.设计以及总体基础架构. 1.简 ...

  7. Apache Hudi与Apache Flink集成

    感谢王祥虎@wangxianghu 投稿 Apache Hudi是由Uber开发并开源的数据湖框架,它于2019年1月进入Apache孵化器孵化,次年5月份顺利毕业晋升为Apache顶级项目.是当前最 ...

  8. 使用Apache Hudi + Amazon S3 + Amazon EMR + AWS DMS构建数据湖

    1. 引入 数据湖使组织能够在更短的时间内利用多个源的数据,而不同角色用户可以以不同的方式协作和分析数据,从而实现更好.更快的决策.Amazon Simple Storage Service(amaz ...

  9. 字节跳动基于Apache Hudi构建EB级数据湖实践

    来自字节跳动的管梓越同学一篇关于Apache Hudi在字节跳动推荐系统中EB级数据量实践的分享. 接下来将分为场景需求.设计选型.功能支持.性能调优.未来展望五部分介绍Hudi在字节跳动推荐系统中的 ...

  10. 基于 Apache Hudi 构建增量和无限回放事件流的 OLAP 平台

    1. 摘要 在本博客中,我们将讨论在构建流数据平台时如何利用 Hudi 的两个最令人难以置信的能力. 增量消费--每 30 分钟处理一次数据,并在我们的组织内构建每小时级别的OLAP平台 事件流的无限 ...

随机推荐

  1. Python全栈工程师之从网页搭建入门到Flask全栈项目实战(4) - Flask模板语法与继承

    1.Flask模板介绍 前置:理解渲染机制即上篇笔记中render_template()功能是如何实现的! 1)找到html文件地址 2)读取html文件中的内容 3)替换html中的特殊字符 4)将 ...

  2. mysql数据库(字段约束条件)

    什么是字段约束 字段约束就是将字段的内容定一个规则,我们要按照规则办事 约束 描述 关键字 非空约束 限制该字段的数据不能为null not null 唯一约束 保证该字段的所有数据都是唯一.不重复的 ...

  3. PyTorch复现LeNet-5手写识别学习笔记

    用PyTorch搭建LeNet-5手写识别 首先申明,这篇博客用于记录本人看完LeNet-5论文,并对其中的算法进行复现的记录,可以看成是学习笔记 这里只介绍复现的工作,如果想了解更多有关网络的细节, ...

  4. VMware虚拟机开机黑屏解决方法

    挂起时可以看到显示,但是开机就黑屏 解决方法: 命令提示符,鼠标右键点击"命令提示符",弹出菜单之后选择"以管理员身份运行" 在命令提示符窗口中输入" ...

  5. EXACT函数

    EXACT函数:EXACT函数是一个文本函数,通过这个函数可以将不同的字符串进行对比,通常用于信息核对. EXACT函数的功能:比较两个字符串是否一致,返回不同的结果. EXACT函数的语法结构:EX ...

  6. Django项目启动 AttributeError: ‘str‘ object has no attribute ‘decode‘ 问题

    Watching for file changes with StatReloader Performing system checks... System check identified no i ...

  7. [机器学习] Yellowbrick使用笔记5-回归可视化

    回归模型试图预测连续空间中的目标.回归计分可视化工具显示模型空间中的实例,以便更好地理解模型是如何进行预测的.代码下载 Yellowbrick已经实施了三种回归评估: 残差图Residuals Plo ...

  8. python之路36 MySQL查询关键字

    报错及作业讲解 报错 1.粗心大意 单词拼写错误 2.手忙脚乱 不会看报错 思考错误的核心 作业讲解 '''表与表中数据的关系可能会根据业务逻辑的不同 发生改变 不是永远固定的''' 服务器表与应用程 ...

  9. Maven初学习

    Maven初学习 摘要:本篇笔记记录了我在初学Maven是认为比较重要的一些知识点. 目录 Maven初学习 1.Maven简介 1.1.项目构建 Ant Maven Gradle 1.2.总结 2. ...

  10. 浏览器刷新时候不删除信息,关闭后删除用户信息处理办法,浏览器监听刷新以及删除事件、cookie、session、sessionStorage、localStorage区别

    首先我们可以了解到:sessionStorage 不在不同的浏览器窗口中共享,即使是同一个页面: localStorage 和 cookie 在所有同源窗口是共享的 那么我们可以根据用户不同需求来进行 ...