分享

Hudi:Copy On Write&Merge On Read解析

 frisky 2022-08-11 发布于浙江

#Hudi学习笔记
1.Copy On Write&Merge On Read解析



Hudi 核心概念之表类型

Hudi有两种表类型Copy On Write(写复制)和Merge On Read(合并读)。这两种表类型决定数据在DFS(data files system)如何写入、存储,索引和查询,所以正确理解这两种表类型,对理解hudi起到至关重要的作用,下面来一起解析他们。


一、Copy On Write?

先上图
在这里插入图片描述
Copy-On-Write文件使用列式存储(如parquet)。数据在写入期间执行同步合并原有数据来更新并重写文件,数据每次提交都会进行隐式压缩,并附带时间戳,。
从这个图中,10:10提交了一份最新数据(粉色),那么在这个提交之前(比如10:07),进行数据查询的时候,只能查到10:05分(绿色)的数据,而正在进行的update/insert的数据相当于吧10:05的数据copy一份,进行合并和更新,等到10;10commit之后,查询就是最新的粉色数据。Copy On Write换个Write On Copy获取更好理解。

二、Merge On Read

在这里插入图片描述
Merge On Read可以看到和Copy-On-Write明显区别。10:05之后新增的数据用基于行式存储(如avro),历史数据还采用列式存储。增量数据放到append log里,并没有和历史数据进行合并,只有在compact(压缩)操作之后,才会与历史文件的合并和更新。那么10:10在查询数据的时候,实际上是历史数据(10:05)+增量数据(06,07,08,09,10)的合并,所以叫Merge On Read,实际就是Read On Merge


三、二种表的特点

Copy On Write:
1 run on committed data:查询数据时候会查询最新commit的数据,而不是最新的文件切片;比如10:07查询上了select count(*),只会有10:05(做了一次commit)的数据,而不会受到后一阶段数据是否成功、失败的影响。
2.数据文件级更新:一个逻辑分区下会存在大量的文件。Copy On Write可以自动更新文件的数据,而不用去更新整个表或者分区。
3.严格控制文件大小以保持出色的查询性能(小文件严重损害查询性能)
4.可以感知增量变化,而不用浪费资源做扫描或者试探。
Merge On Read:
1.提供近乎实时的数据:10:05之后,每一分钟的增量数据,都可以被计算在内而不用等10:10的commit操作
2.历史版本数据和增量日志区分开。
3.可以自主的对历史数据和增量日志进行周期性的compact(压缩)
4.可以进行根据实际需要(是想查的快还是想查的最新的数据)来觉得使用优化查询( Read Optimized query) 或快照查询(Snapshot query)。

四、两类表对比

在这里插入图片描述
1.数据延迟:Copy On Write高,Merge On Read低。从上面例子可以看到Copy On Write有五分钟的延迟,而Merge On Read可以做到一分钟.
2.查询延迟:Copy On Write低,Merge On Read高。Copy On Write查的是一份copy,而Merge On Read是一份Merge数据
3. 更新成本(I/O):Copy On Write高,需要重写整个parquet文件,Merge On Read低,只需要增加到增量日志中。
4. parquet文件大小:Copy On Write小,Merge On Read大
5. 写放大:Copy On Write高,Merge On Read低(依赖压缩策略)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多