【Hudi内核原理】 索引模块

举报
小兔子615 发表于 2021/05/29 18:32:09 2021/05/29
【摘要】 hudi的索引分为三部分:1、索引的数据结构2、索引的写入3、索引的使用1、索引的数据结构hudi的bloomfilter使用的是hadoop的bloomfilter实现,hadoop bloomFilter需要配置每个过滤器(单个文件的过滤器)包含的数据量(hoodie.index.bloom.num_entries, 默认60000),因此,当单文件数据量较大时,存在较大的错误率。在此基...

hudi的索引分为三部分:

1、索引的数据结构
2、索引的写入
3、索引的使用

1、索引的数据结构
image.png

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、索引的使用
image.png

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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。