Hbase-之Bloom Filter布隆过滤器 hbase请求交互
Hbase-之Bloom Filter布隆過(guò)濾器&Hbase
1 BloomFilter是什么?
布隆過(guò)濾器,以它的創(chuàng)始人Burton Howard Bloom的名字命名,首先明確一個(gè)點(diǎn),它只是一個(gè)數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)最開(kāi)始被設(shè)計(jì)成預(yù)測(cè)一個(gè)給定的元素在某個(gè)數(shù)據(jù)集中是否存在,它有如下特點(diǎn):
- 精確的結(jié)果不一定準(zhǔn)確,也就是返回的a存在于集合A結(jié)果不一定是準(zhǔn)確的;
- 不精確的結(jié)果一定是對(duì)的,即a不存在與集合A那是約等于100%是準(zhǔn)確的。
布隆過(guò)濾器很適用于類似于Hbase這樣的大數(shù)據(jù)集,如果想了解更多Bloom Filer可以參閱:布隆過(guò)濾器具體算法實(shí)現(xiàn)
在Hbase中,BloomFilter提供了一個(gè)輕量級(jí)的數(shù)據(jù)結(jié)構(gòu)減少Disk上目標(biāo)rowkey所在文件Storefiles的讀取次數(shù),BloomFilter只能配合Get使用,不能配合Scan使用,這個(gè)東西為集群獲得了更多的并行讀取性能提升(MPP:大規(guī)模并行處理)。
BloomFilter被存儲(chǔ)在HFile的MetaData中,從來(lái)不需要更新,當(dāng)一個(gè)HFile被open查詢的時(shí)候,這個(gè)Bloom過(guò)濾器就會(huì)和metadata一起被加載到BlockCache緩存,一般是加載在LRUBlockCache的高速JVM heap緩存中(L1),而真實(shí)data被加載到L2的BucketCache中(l2,堆外內(nèi)存),具體BlockCache參考:查詢緩存BlockCache
Hbase包含一些調(diào)優(yōu)策略,可以折疊BloomFilter從而減少內(nèi)存占用,還能保證false精準(zhǔn)率在一個(gè)可接受的范圍內(nèi)。
從hbase-0.96 and newer的版本開(kāi)始,row-based BloomFilter默認(rèn)就是啟用的,
2 簡(jiǎn)單解釋BloomFilter原理
BloomFilter使用的算法如下,看的懂的大神覺(jué)得有問(wèn)題還可以在WIKI上編輯修改,成為貢獻(xiàn)者。
WIKI地址:https://en.wikipedia.org/wiki/Bloom_filter
簡(jiǎn)單講解:一個(gè)空的BloomFilter實(shí)際上就是一個(gè)空的bit數(shù)組,數(shù)組中的數(shù)據(jù)初始值都是0,下面是一個(gè)簡(jiǎn)單的BloomFilter的示例。
最開(kāi)始BloomFilter的初始化長(zhǎng)度為18,假設(shè)這里有3種基于長(zhǎng)度18的hash散列算法,將集合{x,y,z}元素分別散列到數(shù)組中的位置,按照不同的hash算法,x,y,z分別在數(shù)組中占了3個(gè)位置,此時(shí)所占位置全都變成1,假如我需要判斷w是否在{x,y,z}中,我們就按照相同的3種hash散列方式,找到w所在的位置,發(fā)現(xiàn)有一個(gè)位置映射在0的位置,很明顯w不在{x,y,z}中。
假如我們將{x,y,z}當(dāng)作HFile中的rowkey space,那么每個(gè)rowkey都在數(shù)組中有3個(gè)為1的位置映射,w也當(dāng)作需要被get的rowkey,很明顯在布隆過(guò)濾器中已經(jīng)顯示不存在w這個(gè)rowkey,就省去了到HFile中去查詢的步驟,大大減少了IO消耗和CPU消耗,提升了查詢的性能。
3 布隆過(guò)濾器在hbase中與客戶端的交互
了解了上面的section,就知道布隆過(guò)濾器大致是什么原理了,那么我們看看如何交互客戶端查詢。
- 上圖的Filter代表BloomFilter
- Storage代表HFile
- 請(qǐng)求從HbaseClient過(guò)來(lái)
第一次客戶端發(fā)來(lái)一個(gè)請(qǐng)求get(key1),布隆過(guò)濾器回應(yīng)沒(méi)有,那么Store就不會(huì)去訪問(wèn)HFile了;
第二次客戶端發(fā)來(lái)一個(gè)請(qǐng)求get(key2),布隆過(guò)濾器回應(yīng)有,那么Store就去HFile中查詢,并將查詢結(jié)果Yes返回;
第三次客戶端發(fā)來(lái)一個(gè)請(qǐng)求get(key2),布隆過(guò)濾器回應(yīng)有,那么Store就去HFile中查詢,但是HFile中沒(méi)有,于是將正確的NO返回。
很明顯,布隆過(guò)濾器false positive是很精準(zhǔn)的,而positive不一定精準(zhǔn),但是也不影響返回結(jié)果。
4 什么時(shí)候使用BloomFilter
從hbase-0.96+以來(lái),row-based BloomFilter默認(rèn)就是開(kāi)啟的,我們可以選擇關(guān)閉它或者將它換成row+column的過(guò)濾器,這個(gè)需要根據(jù)你的加載到Hbase的方式以及你的數(shù)據(jù)的特征。
要確定Bloom過(guò)濾器是否可能產(chǎn)生積極影響,請(qǐng)檢查RegionServer指標(biāo)中的blockCacheHitRatio的值。如果啟用了布隆過(guò)濾器,則blockCacheHitRatio的值應(yīng)增加,因?yàn)椴悸∵^(guò)濾器正在過(guò)濾出絕對(duì)不需要的Blocks。
我們可以選擇一個(gè)row或者row+column類型的布隆過(guò)濾器
- 如果你scan所有行,那么row+column的過(guò)濾器是不能帶來(lái)任何益處的;
- row類型的布隆過(guò)濾器可以適用于row+column的Get操作,反之不行;
- 如果你在一個(gè)row中插入了大量的column Put,那么這個(gè)row的數(shù)據(jù)分布在很多個(gè)storefile中,一個(gè)row類型布隆過(guò)濾器總是返回yes,這樣也是沒(méi)有起到優(yōu)化作用;
- 如果你一個(gè)row只對(duì)應(yīng)一個(gè)column,那么row+column的過(guò)濾器會(huì)占用更大的space,存儲(chǔ)更多的Keyvalue對(duì)象中的key信息,得不償失。
- 當(dāng)每條rowkey對(duì)應(yīng)的數(shù)據(jù)條目的數(shù)據(jù)大小為幾千字節(jié)的時(shí)候,Bloom過(guò)濾器最有效。
當(dāng)你的數(shù)據(jù)存儲(chǔ)在少量的大的StoreFile中時(shí),開(kāi)銷將會(huì)減少,從而避免在StoreFile中掃描指定rowkey產(chǎn)生的額外的磁盤IO;記住,在刪除數(shù)據(jù)之后BloomFilter會(huì)自動(dòng)重建,所以布隆過(guò)濾器不適合有大量刪除操作的場(chǎng)景
5 開(kāi)啟BloomFilter
BloomFilter是啟用在每個(gè)ColumnFamily上的,我們可以使用JavaAPI
//我們可以通過(guò)ColumnDescriptor來(lái)指定開(kāi)啟的BloomFilter的類型 HColumnDescriptor.setBloomFilterType() //可選NONE、ROW、ROWCOL我們還可以在創(chuàng)建Table的時(shí)候指定BloomFilter
hbase> create 'mytable',{NAME => 'colfam1', BLOOMFILTER => 'ROWCOL'}6 BloomFilter相關(guān)的配置參數(shù)
我們可以在hbase-site.xml中配置相關(guān)的參數(shù),不想翻譯了,大家伙培養(yǎng)一下英文閱讀能力哈,么么噠~~
| io.storefile.bloom.enabled | yes | Set to no to kill bloom filters server-wide if something goes wrong |
| io.storefile.bloom.error.rate | .01 | The average false positive rate for bloom filters. Folding is used to maintain the false positive rate. Expressed as a decimal representation of a percentage. |
| io.storefile.bloom.max.fold | 7 | The guaranteed maximum fold rate. Changing this setting should not be necessary and is not recommended. |
| io.storefile.bloom.max.keys | 128000000 | For default (single-block) Bloom filters, this specifies the maximum number of keys. |
| io.storefile.delete.family.bloom.enabled | true | Master switch to enable Delete Family Bloom filters and store them in the StoreFile. |
| io.storefile.bloom.block.size | 131072 | Target Bloom block size. Bloom filter blocks of approximately this size are interleaved with data blocks. |
| hfile.block.bloom.cacheonwrite | false | Enables cache-on-write for inline blocks of a compound Bloom filter. |
總結(jié)
以上是生活随笔為你收集整理的Hbase-之Bloom Filter布隆过滤器 hbase请求交互的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 这些软件测试行业的内幕你知道多少?
- 下一篇: [005]-css实现热气球