Hudi基本概念
||约 3 分钟 · 644 字|评论
请注意,本文编写于 1255 天前,最后修改于 145 天前,其中某些信息可能已经过时。
Hudi
优点
- 高效的upsert
比如hive需要修改某个字段的值的话,更多的使用insert overwreite 的语法实现覆盖写,而hudi则不需要 - 小文件的自动管理
hudi会自动对小文件做一个compaction,实现小文件的合并操作,更智能 - 数据的格式更加开源化
列式存储使用parquet,行式存储使用avro - 流式处理和增量的批处理
基本概念
- 时间线
timeline:记录对hudi表的操作(比如插入数据)- action(commit,delta commit)
- time 比如时间戳20231223102354
- state 记录action的状态(requested,inflight,completed)
- 文件布局
表的元数据和数据存储在同一目录下,区别hive的元数据存储在mysql
- 索引
能够实现高效upsert的原因:
对比hive,假设现在要修改hive某个分区表的1号分区的数据,该分区下有100W条数据,多个文件,现在想要修改其中的100条记录,并新增100条记录 hive表的做法
- 读出1号分区的所有数据
- 对100W条数据中的100条数据修改
- insert overwrite 1号分区 hudi cow表的做法:
- 读取旧版本的parquet数据
- 对旧partquet中其中100条数据更新
- 和新增的100条记录合并形成新的parquet hudi mor表的做法:
- 更新的100条记录写入新的parquet
- 将需要更新的数据写入log文件
- mor表后台根据设置的merge策略进行log和parquet的合并
- 表类型
- copy on write
hudi中数据存储有两种文件,parquet为历史存储数据,log为刚写入的日志数据,表进行分区(partition)后,再划分不同的文件组(filegroup)的概念,每个文件组中有多个文件片(fileslice)结合索引就可以实现多版本并发控制。
cow表在写数据时,会将parquet中的数据进行拷贝一份,与新写入的数据做compact,形成新的parquet,之后形成新的文件片,可见cow表存储目录下只会有parquet文件,没有log文件。cow表适合读多写少的场景 - read on merge
在向mor表写数据时,每次写入都会产生增量文件,新写入的数据存入log文件中, 并根据索引将log放入指定的文件片(fileslice);当向mor表读取时,才会进行合并。可见mor表数据存储目录下可能同时存在parquet和log文件。mor适合写多读少的场景
版权声明