HBase之BloomFilter
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讀性能越好。
總結
以上是生活随笔為你收集整理的HBase之BloomFilter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hbase 高级特性Bloom filt
- 下一篇: java并发包系列---LockSupp