Hudi-数据写操作流程


概述

在hudi数据湖框架中支持三种方式写入数据:UPSERT(插入更新)、INSERT(插入)和BULK INSERT(写排序) UPSERT:默认行为,数据先通过index打标(INSERT/UPDATE),有一些启发式算法决定消息的组织以优化文件的大小 INSERT:跳过index,写入效率更高 BULK_INSERT:写排序,对大数据量额hudi表初始化友好,对文件大小的限制best effort(写HFile)  

UPSERT写入流程

COW类型表,UPSERT写入流程

1.先对records按照record key去重 2.首先对这批数据创建索引(HoodieKey => HoodieRecordLocation),根据record key和分区路径构建索引;通过索引区分哪些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;  

MOR类型表,UPSERT写入流程

1.先对records按照record key去重 2.首先对这批数据创建索引(HoodieKey => HoodieRecordLocation),根据record key和分区路径构建索引;通过索引区分哪些records是update,哪些records是insert(key第一次写入) 3.如果是insert消息     A.如果log file不可建索引(默认),会尝试merge分区内最小的base file(不包含log file的FileSlice),生成新的FileSlice;如果没有base file就新写一个FileGroup + FileSlice + base file     B.如果log file可建索引,尝试append小的log file,如果没有就新写一个FileGroup + FileSlice + base file 4.如果是update消息,写对应的FileGroup + FileSlice,直接append最新的log file(如果碰巧是当前最小的文件,会merge base file,生成新的FileSlice)log file大小达到阈值会roll over一个新的

INSERT写入流程

COW类型表,INSERT写入流程

1.先对records按照record key去重(可选) 2.不会创建index 3.如果有小的base file文件,merge base file,生成新的FileSlice + base file,否则直接写新的FileSlice + base file  

MOR类型表,INSERT写入流程

1.先对records按照record key去重(可选) 2.不会创建index 3.如果log file可索引,并且有小的FileSlice,尝试追加或写最新的log file;如果log file不可索引,写一个新的FileSlice + base file