最近因为想对业务数据处理架构的调整,想要实现对大数据的增量插入/更新的功能,通过调研,Apache Hudi可以实现这方面的功能,遂进行深入的学习。
hudi增量更新功能的实现方式:
1、COW(copy of write):只用列式(例如Parquet)进行数据存储,在写入数据过程中,执行同步合并,更新数据版本并重写数据文件。
2、MOR(merge of read):使用列式(例如Parquet 合并之后的数据) + 行式(avro 新增数据)两种格式进行数据存储。新数据记录到增量文件,然后同步或者异步的方式将增量数据和老数据合并到一块。
查询类型:
1、快照查询:
查询最新的数据。
如果是MOR,将合并最新的基文件(parquet文件)和增量文件(avro)的数据给出近乎实时的数据
如果是COW,就直接读取现有的parquet文件即可(不理解的是,如果另一个进程正在写,读的时候怎么保证是最新的数据)。
2、增量查询:
通过在查询时指定commit或者compaction的时间,可看到指定时间后写入表的最新数据。(我的理解,在你主动commit或者后台进行compaction的时候都会有一个时间记录(hudi里面叫timeline),对于增量查询,就是查询某个commit或者compaction之后的新录入进来的数据。)
3、读取优化查询:
只提供基本文件(parquet)的数据读取。
综上,我的理解:
快照查询-查询的是近实时的数据。
增量查询-查询的是最新更新的数据。
读取优化查询-主要针对MOR模式,为了提高读取性能,只读取这个模式下的基文件(parquet)数据,列存储文件的数据不进行读取。
一些疑惑:
1、网上的一些介绍全部是概念性的东西,没有人举一个具体的例子来说明实际的操作和执行流程,这一点尤为蛋疼,理解起来不是很容易。
2、从官网和其他人的介绍来看,hudi好像只是一个类似于parquet的使用包,只要引用这个包来进行读写就可以了。
但是我不理解的是,对于read of merge模式,他们说的后台进行数据合并是怎么实现的?理论上应该有一个hudi服务,来进行数据的管理和数据的后端合并,但是从各个介绍来看,没有人说需要搭建hudi服务。
等我做一些实际的实例操作,再来赘述。