HBase - BloomFilter(布隆过滤器)

287 阅读3分钟

hbase>describe '表名'  (可查看当前表是什么类型的BloomFilter) ```

, BLOOMFILTER => 'ROW',


### HBase的Get/Scan操作流程

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a1755346caff4e33ad23a41971f597ad~tplv-k3u1fbpfcp-zoom-1.image)\
hbase中有BloomFilter的功能,可以在有些情况下过滤掉不需要的hfile,节省IO。

客户端发起一个read请求,先在一个Bloom filter集合中查找, 然后 在memStore 或在Block cache中查找,在Block cache中查找不到才在StoreFile查找。最后结果merge成一个结果集返回给客户端。\


### BloomFilter作用

**BloomFilter在HBase中的作用?** \
HBase\*\*利用BloomFilter来提高随机读\*\*Get)的性能,对于顺序(Scan)而言,设置Bloomfilter是没有作用的(0.92以后,如果设置了bloomfilter为ROWCOL,对于指定了qualiter的Scan有一定的优化)。

**BloomFilter在HBase中的开销?**\
BloomFilter是一个列族(of)级别的配置属性,如果在表中设置了BloomFilter,那么HBase会在生成StoreFile时,包含一份BloomFilter \
结构的数据,称其为MetaBlock;MetaBlock与DataBlock(真实的KeyValue数据)一起由LRUBlockCache维护,所以开启BloomFilter会有一定的存储及内存cache开销。

### HBase中的Bloomfilter的类型及使用

**1.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)时就会过滤sf1,get(r3)就会过滤sf2

**2.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

### ROWCOL一定比ROW效果好么?

答案:不一定 \
a、ROWCOL只对指定列(Qualifier)的随机读(Get)有效,如果应用中的随机读get,只含row,而没有指定读哪个qualifier,那么设置ROWCOL是没有效果的,这种场景就应该使用ROW。 

b、如果随机读中指定的列(Qualifier)的数目大于等于2,在0.90版本中ROWCOL是无效的,而在0.92版本以后,HBASE-2794对这一情景作了优化,是有效的(通过KeyValueScanner#seekExactly) 

c、如果同一row多个列的数据在应用上是同一时间put的,那么ROW与ROWCOL的效果近似相同,而ROWCOL\*\*只对指定了列\*\*的随机读才会有效,所以设置为ROW更佳。

注意: \
ROWCOL与ROW只在名称上有联系,ROWCOL并不是ROW的扩展,不能取代ROW。 \
region下的storefile数目越多,bloomfilter的效果越好。region下的storefile数目越少,HBase读性能越好。

\


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

\