Hbase 布隆過濾器BloomFilter介紹
1、主要功能
提高隨機讀的效能
2、儲存開銷
bloom filter的資料存在StoreFile的meta中,一旦寫入無法更新,因為StoreFile是不可變的。Bloomfilter是一個列族(cf)級別的配置屬性,如果你在表中設定了Bloomfilter,那麼HBase會在生成StoreFile時包含一份bloomfilter結構的資料,稱其為MetaBlock;MetaBlock與DataBlock(真實的KeyValue資料)一起由LRUBlockCache維護。所以,開啟bloomfilter會有一定的儲存及記憶體cache開銷。
3、控制粒度
a)ROW
根據KeyValue中的row來過濾storefile
舉例:假設有2個storefile檔案sf1和sf2,
sf1包含kv1(r1 cf:q1 v)、kv2(r2 cf:q1 v)
sf2包含kv3(r3 cf:q1 v)、kv4(r4 cf:q1 v)
如果設定了CF屬性中的bloomfilter為ROW,那麼get(r1)時就會過濾sf2,get(r3)就會過濾sf1
b)ROWCOL
根據KeyValue中的row+qualifier來過濾storefile
舉例:假設有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、常用場景
1、根據key隨機讀時,在StoreFile級別進行過濾
2、讀資料時,會查詢到大量不存在的key,也可用於高效判斷key是否存在
5、舉例說明
假設x、y、z三個key存在於table中,W不存在
使用Bloom Filter可以幫助我們減少為了判斷key是否存在而去做Scan操作的次數
step1)分別對x、y、z運算hash函式取得bit mask,寫到Bloom Filter結構中
step2)對W運算hash函式,從Bloom Filter查詢bit mask
如果不存在:三個Bit位至少有一個為0,W肯定不存在該(Bloom Filter不會漏判)
如果存在 :三個Bit位全部全部等於1,路由到負責W的Region執行scan,確認是否真的存在(Bloom Filter有極小的概率誤判)
6、原始碼解析
1.get操作會enable bloomfilter幫助剔除掉不會用到的Storefile
在scan初始化時(get會包裝為scan)對於每個storefile會做shouldSeek的檢查,如果返回false,則表明該storefile裡沒有要找的內容,直接跳過
if (memOnly == false
&& ((StoreFileScanner) kvs).shouldSeek(scan, columns)) {
scanners.add(kvs);
}
shouldSeek方法:如果是scan直接返回true表明不能跳過,然後根據bloomfilter型別檢查。
if (!scan.isGetScan()) {
return true;
}
byte[] row = scan.getStartRow();
switch (this.bloomFilterType) {
case ROW:
return passesBloomFilter(row, 0, row.length, null, 0, 0);
case ROWCOL:
if (columns != null && columns.size() == 1) {
byte[] column = columns.first();
return passesBloomFilter(row, 0, row.length, column, 0, column.length);
}
// For multi-column queries the Bloom filter is checked from the
// seekExact operation.
return true;
default:
return true;
}
2.指明qualified的scan在配了rowcol的情況下會剔除不會用掉的StoreFile。
對指明瞭qualify的scan或者get進行檢查:seekExactly
// Seek all scanners to the start of the Row (or if the exact matching row
// key does not exist, then to the start of the next matching Row).
if (matcher.isExactColumnQuery()) {
for (KeyValueScanner scanner : scanners)
scanner.seekExactly(matcher.getStartKey(), false);
} else {
for (KeyValueScanner scanner : scanners)
scanner.seek(matcher.getStartKey());
}
如果bloomfilter沒命中,則建立一個很大的假的keyvalue,表明該storefile不需要實際的scan
public boolean seekExactly(KeyValue kv, boolean forward)
throws IOException {
if (reader.getBloomFilterType() != StoreFile.BloomType.ROWCOL ||
kv.getRowLength() == 0 || kv.getQualifierLength() == 0) {
return forward ? reseek(kv) : seek(kv);
}
boolean isInBloom = reader.passesBloomFilter(kv.getBuffer(),
kv.getRowOffset(), kv.getRowLength(), kv.getBuffer(),
kv.getQualifierOffset(), kv.getQualifierLength());
if (isInBloom) {
// This row/column might be in this store file. Do a normal seek.
return forward ? reseek(kv) : seek(kv);
}
// Create a fake key/value, so that this scanner only bubbles up to the top
// of the KeyValueHeap in StoreScanner after we scanned this row/column in
// all other store files. The query matcher will then just skip this fake
// key/value and the store scanner will progress to the next column.
cur = kv.createLastOnRowCol();
return true;
}
這邊為什麼是rowcol才能剔除storefile納,很簡單,scan是一個範圍,如果是row的bloomfilter不命中只能說明該rowkey不在此storefile中,但next rowkey可能在。而rowcol的bloomfilter就不一樣了,如果rowcol的bloomfilter沒有命中表明該qualifiy不在這個storefile中,因此這次scan就不需要scan此storefile了!
7、總結
1.任何型別的get(基於rowkey或row+col)Bloom Filter的優化都能生效,關鍵是get的型別要匹配Bloom Filter的型別
2.基於row的scan是沒辦法走Bloom Filter的。因為Bloom Filter是需要事先知道過濾項的。對於順序scan是沒有事先辦法知道rowkey的。而get是指明瞭rowkey所以可以用Bloom Filter,scan指明column同理。
3.row+col+qualify的scan可以去掉不存在此qualify的storefile,也算是不錯的優化了,而且指明qualify也能減少流量,因此scan儘量指明qualify。
相關文章
- 布隆過濾器(BloomFilter)原理 實現和效能測試過濾器OOMFilter
- 布隆過濾器過濾器
- 淺談布隆過濾器過濾器
- Redis-布隆過濾器Redis過濾器
- 布隆過濾器(Bloom Filter)過濾器OOMFilter
- 大白話布隆過濾器過濾器
- Guava的布隆過濾器Guava過濾器
- 布隆過濾器 Bloom Filter過濾器OOMFilter
- Bloom Filter 布隆過濾器OOMFilter過濾器
- 快取問題(二) 布隆過濾器(Bloom Filter) 介紹和原理快取過濾器OOMFilter
- Redis 中的布隆過濾器Redis過濾器
- Redis 應用-布隆過濾器Redis過濾器
- victoriaMetrics庫之布隆過濾器過濾器
- 布隆過濾器 與 Redis BitMap過濾器Redis
- PHP實現布隆過濾器PHP過濾器
- Xor過濾器:比布隆Bloom過濾器更快,更小過濾器OOM
- 布隆過濾器(Bloom Filter)詳解過濾器OOMFilter
- 還有人不懂布隆過濾器嗎?過濾器
- 5分鐘掌握布隆過濾器過濾器
- 從快取穿透聊到布隆過濾器快取穿透過濾器
- 演算法(3)---布隆過濾器原理演算法過濾器
- 布隆過濾器-使用場景的思考過濾器
- Redis詳解(十三)------ Redis布隆過濾器Redis過濾器
- 布隆過濾器的原理及應用過濾器
- Redis布隆過濾器分析與總結Redis過濾器
- 實現布隆過濾器的三種方式過濾器
- 詳解布隆過濾器原理與實現過濾器
- 品味布隆過濾器的設計之美過濾器
- LevelDB 學習筆記1:布隆過濾器筆記過濾器
- 布隆過濾器實戰【防止快取擊穿】過濾器快取
- 那些有趣的演算法之布隆過濾器演算法過濾器
- Redis快取穿透解決方案--布隆過濾器Redis快取穿透過濾器
- 詳解布隆過濾器的原理和實現過濾器
- 面試官問:什麼是布隆過濾器?面試過濾器
- 布隆過濾器解決快取穿透問題過濾器快取穿透
- hbase過濾器過濾器
- AI考拉技術分享--布隆過濾器實戰AI過濾器
- 雜湊表擴充套件—布隆過濾器(Bloom Filter)套件過濾器OOMFilter
- 一文徹底弄清Redis的布隆過濾器Redis過濾器