(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個storfile文件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對比
i. ROWCOL只對指定列(Qualifier)的隨機讀取Get有效,如果應用中的隨機讀取Get只含有row,而且沒有指定讀取哪個qualifier,那么設置ROWCOL是沒有效果的,這種場景就應該使用ROW。
ii. 如果隨機讀中指定的列(Qualifier)的數目大於等於2,在0.9版本中ROWCOL是無效的,0.9版本以后是有效的。
iii. 如果同一個row多個列的數據在應用上是同一時間put的,那么ROW與ROWCOL的效果近似相同,而ROWCOL只對指定了列的隨機讀才會有效,所以設置為ROW更佳。
iv. ROWCOL與ROW只在名稱上有聯系,ROWCOL並不是ROW的擴展,不能取代ROW。