Hbase的Bloomfilter(布隆过滤器)

(1)Bloomfilter在Hbase中的作用

         Hbase利用Bloomfilter来提高随机读(get)的性能,对于顺序读(scan)而言,设置Bloomfilter是没有作用的(0.92版本以后,如果设置了bloomfilter为rowcol,对于执行了qualifier的scan有一定的优化)

(2)Bloomfilter在Hbase中的开销

         Bloomfilter是一个列簇(cf)级别的配置属性,如果在表中设置了Bloomfilter,那么Hbase会在生成storefile时包含一份bloomfilter结构的数据,称其为MetaBlock与DataBlock(真实的keyvalue数据)一起由LRUBlockCache维护。所以开启bloomfilter会有一定的存储及内存cache开销。

(3)Hbase中的Bloomfilter的类型及使用

         a)ROW ,根据keyvalue中的row来过滤storefile。举例:(该情况可以针对列族和列都相同,只有rowkey不同的情况下,可以使用ROW来过滤。)

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

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

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

         如果设置了cf属性的Bloomfilter为Row,那么get(r1)时会过滤sf2,get(r3)时会过滤sf1.

          

        b)  ROWCOL,根据KeyValue中的row+qualifier来过滤storefile。举例:(该情况是针对列族相同,列和rowkey不同的情况,可以用ROWCOL来过滤。)

  如:假设有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。

(4 )ROWCOL 和ROW对比

        rowcol只对指定列(Qualifier)的随机读取Get有效,如果应用中的随机读取Get只含有row,而且没有指定读取哪个qualifier,那么设置ROWCOL是没有效果的,这种场景就应该使用ROW。

       如果随机读中指定的列(Qualifier)的数目大于等于2,在0.9版本中ROWCOL是无效的,0.9版本以后是有效的

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

        ROWCOL与ROW只在名称上有联系,ROWCOL并不是ROW的扩展,不能取代ROW

posted @ 2019-10-10 17:14  hulifang  阅读(997)  评论(0编辑  收藏  举报