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 
 

posted on 2022-02-26 22:13  嘣嘣嚓  阅读(959)  评论(0编辑  收藏  举报

导航