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

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