08布隆过滤器

本文最后更新于 2021-08-05 11:42:59

布隆过滤器

bloom filter的数据存在StoreFile的meta中,一旦写入无法更新,因为StoreFile是不可变的。 Bloomfilter是一个列族(cf)级别的配置属性,如果你在表中设置了Bloomfilter,那么HBase会在生成StoreFile时包含一份bloomfilter结构的数据,称其为MetaBlock;MetaBlock与DataBlock(真实的KeyValue数据)一起由LRUBlockCache维护。所以,开启bloomfilter会有一定的存储及内存cache开销。

控制粒度

ROW

根据KeyValue中的row来过滤storefile

举例:假设有2个storefile文件sf1和sf2,

sf1包含kv1(r1 cf:q1 v)、kv2(r2 cf:q1 v)

sf2包含kv3(r3 cf:q1 v)、kv4(r4 cf:q1 v)

如果设置了CF属性中的bloomfilter为ROW,那么get(r1)时就会过滤sf2,get(r3)就会过滤sf1

相当于是看rowkey

ROWCOL

根据KeyValue中的row+qualifier来过滤storefile

举例:假设有2个storefile文件sf1和sf2,

sf1包含kv1(r1 cf:q1 v)、kv2(r2 cf:q1 v)

sf2包含kv3(r1 cf:q2 v)、kv4(r2 cf:q2 v)

如果设置了CF属性中的bloomfilter为ROW,无论get(r1,q1)还是get(r1,q2),都会读取sf1+sf2;而如果设置了CF属性中的bloomfilter为ROWCOL,那么get(r1,q1)就会过滤sf2,get(r1,q2)就会过滤sf1

相当于是看rowkey+qualifier

注意点

  1. 任何类型的get(基于rowkey或row+col)Bloom Filter的优化都能生效,关键是get的类型要匹配Bloom Filter的类型

  2. 基于row的scan是没办法走Bloom Filter的。因为Bloom Filter是需要事先知道过滤项的。对于顺序scan是没有事先办法知道rowkey的。而get是指明了rowkey所以可以用Bloom Filter,scan指明column同理。

  3. row+col+qualify的scan可以去掉不存在此qualify的storefile,也算是不错的优化了,而且指明qualify也能减少流量,因此scan尽量指明qualify。


08布隆过滤器
https://jiajun.xyz/2020/11/07/bigdata/03hbase/08布隆过滤器/
作者
Lambda
发布于
2020年11月7日
更新于
2021年8月5日
许可协议