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 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM