HBase之BloomFilter,hbasebloomfilter


HBase的Get/Scan操作流程


hbase中有BloomFilter的功能,可以在有些情况下过滤掉不需要的hfile,节省IO。

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的类型及使用

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

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读性能越好。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关内容