首页 > 其他分享 >Hudi——写流程(UPSERT)

Hudi——写流程(UPSERT)

时间:2023-04-24 22:36:00浏览次数:31  
标签:文件 Hudi FileSlice 记录 流程 更新 索引 file UPSERT

COW(Copy-on-Write)

COW(Copy-on-Write)更新流程如下

  1. 首先,对要更新的数据进行去重,确保每个记录只有一个条目。这是为了避免多个记录更新同一个键,导致数据不一致。

  2. 对这批数据创建索引,将HoodieKey(包含键和分区信息)映射到HoodieRecordLocation(包含文件ID和记录偏移量)。创建索引 (HoodieKey => HoodieRecordLocation);通过索引区分哪些 records 是 update,哪些 records 是 insert(key 第一次写入)。这个索引可以帮助我们快速查找要更新的记录所在的文件和位置

  3. 对于 update 消息,会直接找到对应 key 所在的最新 FileSlice 的 base 文件,并做 merge 后写新的 base file (新的 FileSlice)

  4. 对于 insert 消息,会扫描当前 partition 的所有 SmallFile(小于一定大小的 base file),然后 merge 写新的 FileSlice;如果没有 SmallFile,直接写新的 FileGroup + FileSlice

这个流程可以保证数据的一致性和可靠性,因为它使用了Copy-on-Write的策略,即每次更新都会生成一个新的数据文件,而不是直接在原始文件上进行修改。这样可以避免原始文件被损坏,同时也可以保留所有历史版本的数据。

MOR(Merge-on-Read)

MOR(Merge-on-Read)更新流程如下:

  1. 首先,对要更新的数据进行去重,对 records 按照 record key 去重(可选),确保每个记录只有一个条目。这是为了避免多个记录更新同一个键,导致数据不一致。

  2. 对这批数据创建索引,将HoodieKey(包含键和分区信息)映射到HoodieRecordLocation(包含文件ID和记录偏移量)。创建索引 (HoodieKey => HoodieRecordLocation);通过索引区分哪些 records 是 update,哪些 records 是 insert(key 第一次写入).这个索引可以帮助我们快速查找要更新的记录所在的文件和位置。

    • 2.1如果是 insert 消息,如果 log file 不可建索引(默认),会尝试 merge 分区内最小的 base file (不包含 log file 的 FileSlice),生成新的 FileSlice;如果没有 base file 就新写一个 FileGroup + FileSlice + base file;如果 log file 可建索引,尝试 append 小的 log file,如果没有就新写一个 FileGroup + FileSlice + base file
    • 2.2 如果是 update 消息,写对应的 file group + file slice,直接 append 最新的 log file(如果碰巧是当前最小的小文件,会 merge base file,生成新的 file slice)
  3. 对于要更新的记录,通过索引找到它们所在的文件和位置。然后,将它们写入到一个新的日志文件中。如果日志文件大小达到阈值,就会创建一个新的日志文件。

  4. 对于要插入的记录,如果日志文件大小不超过阈值,就将它们写入到当前日志文件中。否则,如果当前没有已经建立索引的基础文件,就创建一个新的文件组和文件切片,并将记录写入到一个新的基础文件中。如果当前有已经建立索引的基础文件,则在最小的基础文件上进行合并,生成新的文件切片和基础文件。

  5. 对于要更新的记录,将它们写入到对应的文件组和文件切片中。如果当前的文件切片大小不超过阈值,就将记录追加到当前文件切片中。否则,如果当前文件切片没有基础文件,就创建一个新的基础文件,并将记录写入到其中。如果当前文件切片有基础文件,则在最小的基础文件上进行合并,生成新的文件切片和基础文件。

  6. 对于要删除的记录,将它们标记为已删除,并写入到对应的文件组和文件切片中。

  7. 对于每个文件切片,创建索引,以加速查询和更新操作。

MOR的优点是它的存储开销较小,因为它只需要一个视图文件。它还可以快速地查询和删除数据,因为所有的数据都在一个文件中。但是,缺点是它的更新速度较慢,因为它需要将原始数据文件和更新数据文件合并成一个视图文件。

总的来说,COW适用于更新数据量较小的情况,而MOR适用于更新数据量较大的情况。

标签:文件,Hudi,FileSlice,记录,流程,更新,索引,file,UPSERT
From: https://blog.51cto.com/hiszm/6221941

相关文章

  • Xlua热更流程
    转载自:深入理解xLua基于IL代码注入的热更新原理-iwiniwin-博客园(cnblogs.com)例子:第一步:GenerateCode:为打了Hotfix标签的方法生成对应的匹配函数[Hotfix]publicclassTestXLua{publicintAdd(inta,intb){returna-b;//这里的Add方法故意......
  • JAVA流程控制
    Java流程控制一、Scanner对象next():一定要读取到有效字符后才可以结束输入对输入有效字符之前遇到的空白,next()方法会自动将其去掉只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符next()不能得到带有空格的字符串nextLine():以Enter为结束符也就是说ne......
  • 分析需要修改的地方与SpringSecurity完整流程
    分析需要修改的地方 原理初探​想要知道如何实现自己的登陆流程就必须要先知道入门案例中SpringSecurity的流程。SpringSecurity完整流程SpringSecurity完整流程SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤......
  • SpringSecurity从入门到精通:如何查看具体的过滤器&入门案例认证流程图讲解
    如何查看具体的过滤器  入门案例认证流程图讲解 概念速查:Authentication接口:它的实现类,表示当前访问系统的用户,封装了用户相关信息AuthenticationManager接口:定义了认证Authentication的方法UserDetailsService接口:加载用户特定数据的核心接口,里面定义了......
  • Innodb实现事务流程
    Innodb通过BufferPool,LogBuffer,RedoLog,UndoLog来实现事务,以update语句为例:Innodb在收到update语句后,会先根据条件找到数据所在⻚,并将该⻚缓存在BufferPool执⾏update语句,修改BufferPool中的数据针对update语句⽣成⼀个RedoLog对象,并存⼊LogBuffer针对update语句......
  • 抓交通肇事犯流程图及代码
    问题描述:一辆卡车违反交通规则,撞人后逃跑。现场有三人目击该事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。设计思路:   ......
  • apisix网关使用自研插件流程
    1. 关于apisix网关插件apisix插件分为内置插件和自编插件,本文主要介绍使用自研插件的流程,内置插件使用方法参考官方文档内置插件官方文档:https://apisix.apache.org/zh/docs/apisix/plugins/batch-requests/2. 使用自研插件的实现步骤apisix支持多种语言自研插件,本文主要介......
  • SAP SD 基本业务流程
                  物料客户价格客户-物料列表/排斥 加库存 信用管理(ECC) 创建MM01BP/FLCU1/XD01VK11VD51VB01 物料凭证(库存)migo(561) 客户信用主数据fd32 修改MM02BP/FLCU2/XD02VK12VD52VB02......
  • 软件开发工作总体流程图 、软件测试活动分布图、软件测试流程关系图
     软件测试的流程软件测试的流程一般要考虑3点:软件测试工作总体流程图、软件测试活动分布图和软件测试流程关系图。1.4.1软件开发工作总体流程图软件测试的流程图分为软件测试工作总体流程图、需求阶段测试工作流程图、设计与编码阶段测试工作流程图、集成测试和系统测试阶段工......
  • SpringMVC启动流程源码分析
    SpringMVC向WEB容器中注入了两个对象:ContextLoaderListener:由AbstractContextLoaderInitializer注入。DispatcherServlet:由AbstractDispatcherServletInitializer注入。下面分别分析这两个对象在WEB容器启动时做了什么工作?ContextLoaderListenerContextLoaderListener实现了Servle......