环境
hudi upsert写过程最为复杂,流程上有一个桶分配的环节,当以flink state为索引时,流程变得更长,所以写入性能较差。
- hudi 0.13.0
- mor表+insert/upsert 或 cow表+upsert
- flink状态索引
核心类为BucketAssignFunction和StreamWriteFunction
由于存在着语义上的迷惑,从flink 0.13.1开始mor insert将不再走upsert写过程,而是与cow insert合并,至此,insert统一为append模式,写入只生成parquet文件
整体流程
| pk1,pk4 | ===\ /=== | bucket assigner1 | ===\ /=== | write task1(pk1,pk2) |
shuffle(by PK) shuffle(by bucket ID)
| pk2,pk3 | ===/ \=== | bucket assigner2 | ===/ \=== | write task2(pk3,pk4) |
- 流中的数据先根据主键进行shuffle,由于主键的唯一性,所以同一记录后续的变更都会分配到相同的bucket a
本文详细介绍了Hudi的upsert写入过程,尤其是在使用Flink状态索引时的复杂性。流程包括桶分配和数据写入。数据首先根据主键进行shuffle,然后分配到特定的bucket assigner中。在MOR表中,无论是append还是upsert,都会经历桶分配,但upsert涉及删除旧分区记录并在新分区分配新位置。文章强调了合理设置并行度和Flink状态的重要性,并指出写数据时会触发缓存数据的刷盘操作,以及Write Coordinator的角色。
订阅专栏 解锁全文
1990

被折叠的 条评论
为什么被折叠?



