目录
- 数据写
- 写操作
- 写流程(UPSERT)
- 写流程(Insert)
- 写流程(Insert Overwrite)
- Key生成策略
- 删除策略
数据写
写操作
- UPSERT:默认行为,数据先通过index打标,有一些启发式算法决定消息的组织以及优化文件的大小==>CDC导入
- INSERT:跳过index,写入效率更高==>Log Defuplication
- BULK_INSERT:写顺序,对大数据量的Hudi表初始化友好,对文件的大小限制best offort(写HFile)
写流程(UPSERT)
- COW
(1)先对 records 按照 record key 去重
(2)首先对这批数据创建索引 (HoodieKey => HoodieRecordLocation);通过索引区分哪些 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
(1)先对 records 按照 record key 去重(可选)
(2)首先对这批数据创建索引 (HoodieKey => HoodieRecordLocation);通过索引区分哪些 records 是 update,哪些 records 是 insert(key 第一次写入)
(3)如果是 insert 消息,如果 log file 不可建索引(默认),会尝试 merge 分区内最小的 base file (不包含 log file 的 FileSlice),生成新的 FileSlice;如果没有 base file 就新写一个 FileGroup + FileSlice + base file;如果 log file 可建索引,尝试 append 小的 log file,如果没有就新写一个 FileGroup + FileSlice + base file
(4)如果是 update 消息,写对应的 file group + file slice,直接 append 最新的 log file(如果碰巧是当前最小的小文件,会 merge base file,生成新的 file slice)
(5)log file 大小达到阈值会 roll over 一个新的
写流程(Insert)
-
COW
(1)先对records按照 record key 去重(可选)
(2)不会创建index
(3) 如果有小的base file文件,merge base file,生成新的FileSlice+base file,否则直接写新的 FileSlice + base file -
MOR
(1)先对records按照 record key 去重(可选)
(2)不会创建index
(3) 如果log file可索引,并且有写的FileSlice,尝试追加或写最新的log file;如果log file不可索引,写一个新的 FileSlice+base file.
写流程(Insert Overwrite)
在同一个分区中创建新的文件组集。现有的文件组被标记为"删除"。根据最新记录的数据创建新的文件组。
- COW
- MOR
Key生成策略
用来生成HoodileKey+(record key + partition path),目前支持一下策略:
- 支持多个字段组个record keys
- 支持多个字段组合的partition path
- 非分区表
删除策略
1)逻辑删:将value字段全部标记为null
2)物理删:
1、通过OPERATION_OPT_KET删除所有输入记录
2、配置PAYLOAD_CLASS)OPT_KEY=org.apache.hudi.EmptyHoodieRecordPayload 删除所有输入记录
3、在输入记录添加字段L_hoodie_is_deleted