`
shenchunhui
  • 浏览: 146198 次
  • 来自: 杭州
社区版块
存档分类
最新评论

对HBase中Bloomfilter类型的设置及使用的理解

阅读更多
1.Bloomfilter的原理?
可参考 http://hi.baidu.com/yizhizaitaobi/blog/item/cc1290a0a0cd69974610646f.html

2.Bloomfilter在HBase中的作用?
HBase利用Bloomfilter来提高随机读(Get)的性能,对于顺序读(Scan)而言,设置Bloomfilter是没有作用的(0.92以后,如果设置了bloomfilter为ROWCOL,对于指定了qualifier的Scan有一定的优化,但不是那种直接过滤文件,排除在查找范围的形式)

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

4.Bloomfilter如何提高随机读(Get)的性能?
对于某个region的随机读,HBase会遍历读memstore及storefile(按照一定的顺序),将结果合并返回给客户端。如果你设置了bloomfilter,那么在遍历读storefile时,就可以利用bloomfilter,忽略某些storefile。

5.HBase中的Bloomfilter的类型及使用?

a)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

b)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

6.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更佳

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

8.region下的storefile数目越多,bloomfilter的效果越好

9.region下的storefile数目越少,HBase读性能越好


如有错误,谢谢指正!
分享到:
评论
6 楼 leibnitz 2014-10-20  
shenchunhui 写道
楼上的同学的英文选摘,不知出自何处,但实际上Scan是不会对文件进行过滤的,why?
其实很好理解:
假设目录有2个文件,文件1中记录的kv为row A至row K;文件2中记录的kv为row L至 row Z;那么如果某次scan其startRow是a,endRow为空,难道bloomfilter要过滤文件2?

不过,0.92以后的版本,对于bloomfilter类型为ROW+COL,对于指定qualifier的scan会有一些优化,但不是那种直接过滤的方式


引用错了,应该是基于这个的,sorry
5 楼 leibnitz 2014-10-20  
chenchao051 写道
shenchunhui 写道
楼上的同学的英文选摘,不知出自何处,但实际上Scan是不会对文件进行过滤的,why?
其实很好理解:
假设目录有2个文件,文件1中记录的kv为row A至row K;文件2中记录的kv为row L至 row Z;那么如果某次scan其startRow是a,endRow为空,难道bloomfilter要过滤文件2?

不过,0.92以后的版本,对于bloomfilter类型为ROW+COL,对于指定qualifier的scan会有一些优化,但不是那种直接过滤的方式


一楼的内容来自 HBase The Definitive Guide一书,p379


没用过BF,但觉得你这是特殊情况,过滤与否都是一样.
但对于如果scan只是部分files时,过依然是明智的
4 楼 agilesc 2013-03-28  
个人觉得这个bloomfilter 在scan的时候,只对松散的表有作用吧。如果根据column+quator过来的话,如果我的是表每行数据每一个quator都有数据的话。一个storeFile不肯定是包含所有该family下的quator的数据的。对于楼主举的例子:

sf1包含kv1(r1 cf:q1 v)、kv2(r2 cf:q1 v)
sf2包含kv3(r1 cf:q2 v)、kv4(r2 cf:q2 v)

这种情况。只有松散的表才会出现吧。比如我的一行记录是只有q1,而另外一行只有q2.
这样我scan的时候只查q2.是可以过滤掉。如果是很严谨的话,那sf1肯定是会包含q1和q2的吧。这样就不能过滤掉其中一个了吧

不知道我的理解对不对。请楼主解答下。
3 楼 chenchao051 2012-11-13  
shenchunhui 写道
楼上的同学的英文选摘,不知出自何处,但实际上Scan是不会对文件进行过滤的,why?
其实很好理解:
假设目录有2个文件,文件1中记录的kv为row A至row K;文件2中记录的kv为row L至 row Z;那么如果某次scan其startRow是a,endRow为空,难道bloomfilter要过滤文件2?

不过,0.92以后的版本,对于bloomfilter类型为ROW+COL,对于指定qualifier的scan会有一些优化,但不是那种直接过滤的方式


一楼的内容来自 HBase The Definitive Guide一书,p379
2 楼 shenchunhui 2012-07-11  
楼上的同学的英文选摘,不知出自何处,但实际上Scan是不会对文件进行过滤的,why?
其实很好理解:
假设目录有2个文件,文件1中记录的kv为row A至row K;文件2中记录的kv为row L至 row Z;那么如果某次scan其startRow是a,endRow为空,难道bloomfilter要过滤文件2?

不过,0.92以后的版本,对于bloomfilter类型为ROW+COL,对于指定qualifier的scan会有一些优化,但不是那种直接过滤的方式
1 楼 shenbai 2012-06-19  
对于顺序读(Scan)而言,设置Bloomfilter是没有作用的

这个说法不合适,你的理解有偏差,如果开启了bloom Filter,无论是get还是Scan都做是否在文件中的检查。

The final question is whether to use a row or a row+column Bloom filter. The answer
depends on your usage pattern. If you are doing only row scans, having the more specific row+column filter will not help at all: having a row-level Bloom filter enables you to narrow down the number of files that need to be checked, even when you do row+column read operations, but not the other way around.

相关推荐

Global site tag (gtag.js) - Google Analytics