布隆過濾器在HBase中的應(yīng)用 - Echo的博客 - 博客頻道 - CSDN.NET
http://blog.csdn.net/echozhan/article/details/53154009
在討論布隆過濾器在Hbase中的應(yīng)用之前,先介紹一下HBase的塊索引機制。塊索引是HBase固有的一個特性,因為HBase的底層數(shù)據(jù)是存儲在HFile中的,而每個HFile中存儲的是有序的<key, value>鍵值對,HFile文件內(nèi)部由連續(xù)的塊組成[1],每個塊中存儲的第一行數(shù)據(jù)的行鍵組成了這個文件的塊索引,這些塊索引信息存儲在文件尾部。當(dāng)HBase打開一個HFile時,塊索引信息會優(yōu)先加載到內(nèi)存;HBase首先在內(nèi)存的塊索引中進行二分查找,確定可能包含給定鍵的塊,然后讀取磁盤塊找到實際想要的鍵。
但實際應(yīng)用中,僅僅只有塊索引滿足不了需求,這是因為,塊索引能幫助我們更快地在一個文件中找到想要的數(shù)據(jù),但是我們可能依然需要掃描很多文件。而布隆過濾器就是為解決這個問題而生。因為布隆過濾器的作用是,用戶可以立即判斷一個文件是否包含特定的行鍵,從而幫我們過濾掉一些不需要掃描的文件。如下圖所示,塊索引顯示每個文件中都可能包含對應(yīng)的行鍵,而布隆過濾器能幫我們跳過一些明顯不包含對應(yīng)行鍵的文件。

在使用布隆過濾器時,需要注意兩個問題:
- 什么時候應(yīng)該使用布隆過濾器?根據(jù)上面的描述,布隆過濾器的主要作用,是幫助HBase跳過那些顯然不包括所查找數(shù)據(jù)的底層文件。那么,當(dāng)所查找的數(shù)據(jù)均勻分布在所有文件中(當(dāng)用戶定期更新所有行時,就可能導(dǎo)致這種情況),布隆過濾器的作用就微乎其微,反而浪費了存儲空間。相反,如果我們查找的數(shù)據(jù)只包含在少部分的文件中,就應(yīng)該果斷使用布隆過濾器。
- 應(yīng)該選擇行級還是行加列級布隆過濾器?很顯然,行加列級因為粒度更細,占用的存儲空間也就越多。因此,如果用戶總是讀取整行的數(shù)據(jù),行級布隆過濾器就夠用了。在可以選擇的情形下,盡可能使用行級布隆過濾器,因為它在額外的空間開銷和利用過濾存儲文件提升性能之間取得了更好的平衡。
注[1]: 注意這里的塊不是HDFS的塊,HBase塊的默認大小是64KB??梢愿鶕?jù)需要配置不同的大小,對于順序訪問較多的表,建議使用較大的塊;隨機訪問較多的表,建議使用較小的塊。
HBase–常用過濾器篇 - 圈里圈外 - 開源中國社區(qū)
https://my.oschina.net/circleblog/blog/715724
5. 布隆過濾器 BloomFilter簡介:hbase的storefile有很多,隨機查的時候可能需要遍歷很多storefile,如果在建表的時候指定了bloomfilter,則在get查詢(scan不管用)的時候就可以過濾掉很多不符合規(guī)則的storefile,提高查詢效率。