日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hbase-之Bloom Filter布隆过滤器 hbase请求交互

發(fā)布時間:2024/5/14 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hbase-之Bloom Filter布隆过滤器 hbase请求交互 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Hbase-之Bloom Filter布隆過濾器&Hbase

1 BloomFilter是什么?

布隆過濾器,以它的創(chuàng)始人Burton Howard Bloom的名字命名,首先明確一個點,它只是一個數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)最開始被設計成預測一個給定的元素在某個數(shù)據(jù)集中是否存在,它有如下特點:

  • 精確的結(jié)果不一定準確,也就是返回的a存在于集合A結(jié)果不一定是準確的;
  • 不精確的結(jié)果一定是對的,即a不存在與集合A那是約等于100%是準確的。

布隆過濾器很適用于類似于Hbase這樣的大數(shù)據(jù)集,如果想了解更多Bloom Filer可以參閱:布隆過濾器具體算法實現(xiàn)

在Hbase中,BloomFilter提供了一個輕量級的數(shù)據(jù)結(jié)構(gòu)減少Disk上目標rowkey所在文件Storefiles的讀取次數(shù),BloomFilter只能配合Get使用,不能配合Scan使用,這個東西為集群獲得了更多的并行讀取性能提升(MPP:大規(guī)模并行處理)。

BloomFilter被存儲在HFile的MetaData中,從來不需要更新,當一個HFile被open查詢的時候,這個Bloom過濾器就會和metadata一起被加載到BlockCache緩存,一般是加載在LRUBlockCache的高速JVM heap緩存中(L1),而真實data被加載到L2的BucketCache中(l2,堆外內(nèi)存),具體BlockCache參考:查詢緩存BlockCache

Hbase包含一些調(diào)優(yōu)策略,可以折疊BloomFilter從而減少內(nèi)存占用,還能保證false精準率在一個可接受的范圍內(nèi)。

從hbase-0.96 and newer的版本開始,row-based BloomFilter默認就是啟用的,

2 簡單解釋BloomFilter原理

BloomFilter使用的算法如下,看的懂的大神覺得有問題還可以在WIKI上編輯修改,成為貢獻者。

WIKI地址:https://en.wikipedia.org/wiki/Bloom_filter

簡單講解:一個空的BloomFilter實際上就是一個空的bit數(shù)組,數(shù)組中的數(shù)據(jù)初始值都是0,下面是一個簡單的BloomFilter的示例。

最開始BloomFilter的初始化長度為18,假設這里有3種基于長度18的hash散列算法,將集合{x,y,z}元素分別散列到數(shù)組中的位置,按照不同的hash算法,x,y,z分別在數(shù)組中占了3個位置,此時所占位置全都變成1,假如我需要判斷w是否在{x,y,z}中,我們就按照相同的3種hash散列方式,找到w所在的位置,發(fā)現(xiàn)有一個位置映射在0的位置,很明顯w不在{x,y,z}中。

假如我們將{x,y,z}當作HFile中的rowkey space,那么每個rowkey都在數(shù)組中有3個為1的位置映射,w也當作需要被get的rowkey,很明顯在布隆過濾器中已經(jīng)顯示不存在w這個rowkey,就省去了到HFile中去查詢的步驟,大大減少了IO消耗和CPU消耗,提升了查詢的性能。

3 布隆過濾器在hbase中與客戶端的交互

了解了上面的section,就知道布隆過濾器大致是什么原理了,那么我們看看如何交互客戶端查詢。

  • 上圖的Filter代表BloomFilter
  • Storage代表HFile
  • 請求從HbaseClient過來

第一次客戶端發(fā)來一個請求get(key1),布隆過濾器回應沒有,那么Store就不會去訪問HFile了;

第二次客戶端發(fā)來一個請求get(key2),布隆過濾器回應有,那么Store就去HFile中查詢,并將查詢結(jié)果Yes返回;

第三次客戶端發(fā)來一個請求get(key2),布隆過濾器回應有,那么Store就去HFile中查詢,但是HFile中沒有,于是將正確的NO返回。

很明顯,布隆過濾器false positive是很精準的,而positive不一定精準,但是也不影響返回結(jié)果。

4 什么時候使用BloomFilter

從hbase-0.96+以來,row-based BloomFilter默認就是開啟的,我們可以選擇關閉它或者將它換成row+column的過濾器,這個需要根據(jù)你的加載到Hbase的方式以及你的數(shù)據(jù)的特征。

要確定Bloom過濾器是否可能產(chǎn)生積極影響,請檢查RegionServer指標中的blockCacheHitRatio的值。如果啟用了布隆過濾器,則blockCacheHitRatio的值應增加,因為布隆過濾器正在過濾出絕對不需要的Blocks。

我們可以選擇一個row或者row+column類型的布隆過濾器

  • 如果你scan所有行,那么row+column的過濾器是不能帶來任何益處的;
  • row類型的布隆過濾器可以適用于row+column的Get操作,反之不行;
  • 如果你在一個row中插入了大量的column Put,那么這個row的數(shù)據(jù)分布在很多個storefile中,一個row類型布隆過濾器總是返回yes,這樣也是沒有起到優(yōu)化作用;
  • 如果你一個row只對應一個column,那么row+column的過濾器會占用更大的space,存儲更多的Keyvalue對象中的key信息,得不償失。
  • 當每條rowkey對應的數(shù)據(jù)條目的數(shù)據(jù)大小為幾千字節(jié)的時候,Bloom過濾器最有效。

當你的數(shù)據(jù)存儲在少量的大的StoreFile中時,開銷將會減少,從而避免在StoreFile中掃描指定rowkey產(chǎn)生的額外的磁盤IO;記住,在刪除數(shù)據(jù)之后BloomFilter會自動重建,所以布隆過濾器不適合有大量刪除操作的場景

5 開啟BloomFilter

BloomFilter是啟用在每個ColumnFamily上的,我們可以使用JavaAPI

//我們可以通過ColumnDescriptor來指定開啟的BloomFilter的類型 HColumnDescriptor.setBloomFilterType() //可選NONE、ROW、ROWCOL

我們還可以在創(chuàng)建Table的時候指定BloomFilter

hbase> create 'mytable',{NAME => 'colfam1', BLOOMFILTER => 'ROWCOL'}

6 BloomFilter相關的配置參數(shù)

我們可以在hbase-site.xml中配置相關的參數(shù),不想翻譯了,大家伙培養(yǎng)一下英文閱讀能力哈,么么噠~~

ParameterDefaultDescription
io.storefile.bloom.enabledyesSet to no to kill bloom filters server-wide if something goes wrong
io.storefile.bloom.error.rate.01The 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.fold7The guaranteed maximum fold rate. Changing this setting should not be necessary and is not recommended.
io.storefile.bloom.max.keys128000000For default (single-block) Bloom filters, this specifies the maximum number of keys.
io.storefile.delete.family.bloom.enabledtrueMaster switch to enable Delete Family Bloom filters and store them in the StoreFile.
io.storefile.bloom.block.size131072Target Bloom block size. Bloom filter blocks of approximately this size are interleaved with data blocks.
hfile.block.bloom.cacheonwritefalseEnables cache-on-write for inline blocks of a compound Bloom filter.

總結(jié)

以上是生活随笔為你收集整理的Hbase-之Bloom Filter布隆过滤器 hbase请求交互的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。