【Hudi内核原理】 索引模块
【摘要】 hudi的索引分为三部分:1、索引的数据结构2、索引的写入3、索引的使用1、索引的数据结构hudi的bloomfilter使用的是hadoop的bloomfilter实现,hadoop bloomFilter需要配置每个过滤器(单个文件的过滤器)包含的数据量(hoodie.index.bloom.num_entries, 默认60000),因此,当单文件数据量较大时,存在较大的错误率。在此基...
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类进行匹配
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)