【Hudi内核原理】 索引模块
hudi的索引分为三部分:
1、索引的数据结构
2、索引的写入
3、索引的使用
1、索引的数据结构
hudi的bloomfilter使用的是hadoop的bloomfilter实现,hadoop bloomFilter需要配置每个过滤器(单个文件的过滤器)包含的数据量(hoodie.index.bloom.num_entries, 默认60000),因此,当单文件数据量较大时,存在较大的错误率。
在此基础上,hudi扩展出了HoodieDynamicBoundBloomFilter,主要作用是使用多个bloomFilter以处理更多的数据
2、索引的写入
当前只有parquet文件写入时支持保存bloomFilter,实现方法为:
在HoodieAvroWriteSupport的finalizeWrite方法中,在parquet文件的footer中,写入MinMax值,以及bloomfilter数据(此行为无法关闭)
3、索引的使用
1)HoodieIndex并不是索引数据本身,而是构造索引结果的接口。hoodie的索引用于写入新数据时,定位旧数据所在的fileID,并且hudi仅支持base文件的索引。
2)hudi支持多种类型的索引:HBASE, INMEMORY, BLOOM, GLOBAL_BLOOM, SIMPLE, GLOBAL_SIMPLE
3)Simple索引:根据新数据所在的分区,获取受影响的分区文件列表,直接读取该部分parquet文件的partition_key和record_key,与新数据执行leftOutJoin产生索引数据,性能低下(以hoodieKey为匹配键)
4)global simple索引:与非global索引相比,global索引读取的旧数据是全量数据,以recordkey为匹配键,性能更低下
5)INMEMRY索引:根据内存中的索引数据去匹配,基本不可用
6)BLOOM:对比simple索引,优化的点在:1)首先使用minmax信息过滤受影响的文件;2)再使用bloomFilter过滤文件;3)对可能匹配的文件,再读取该部分parquet文件的partition_key和record_key,与新数据执行leftOutJoin产生索引数据
7)global bloom:与bloom的区别类比simple
8)IndexFileFilter:使用parquet文件中的minmax构造搜索树,进行mimmax过滤
9)HoodieBaseBloomIndexCheckFunction:使用bloomfilter过滤可能的文件,在对匹配结果,读取文件的key类进行匹配
- 点赞
- 收藏
- 关注作者
评论(0)