hbase中二級索引的實現 ihbase

2021-08-27 19:06:03 字數 1528 閱讀 6949

一般來說,對資料庫建立索引,往往需要單獨的資料結構來儲存索引的資料.在為hbase建立索引時,可以另外建立一張索引表,查詢時先查詢索引表,然後用查詢結果查詢資料表.

[img]

這個圖左邊表示索引表,右邊是資料表.

但是對於hbase這種分布式的資料庫來說,最大的問題是解決索引表和資料表的本地性問題,hbase很容易就因為負載均衡,表split等原因把索引表和資料表的資料分布到不同的region server上,比如下圖中,資料表和索引表就出現在了不同的region server上

[img]

所以為了解決這個問題,[url=專案應運而生,它的主要思想是在region級別建立索引而不是在表級別.

它的解決方案是用idxregion代替了常規的region實現,在flush的時候為region建立索引

@override

protected void internalpreflashcachecommit() throws ioexception

在scan的時候,提供特殊的scanner

@override

protected internalscanner instantiateinternalscanner(scan scan,

listadditionalscanners) throws ioexception else

return new idxregionscanner(scan, searchcontext, matchedexpression);

}}

ihbase在記憶體中為region維護了乙份索引,在scan的時候首先在索引中查詢資料,按順序提供rowkey,而在常規的scan時,能利用上一步的rowkey來move forward,有目的的進行seek.

idxregionscanner在進行scan的時候,用索引來構造keyprovider,然後執行next方法時,用keyprovider提供的rowkey進行定位

@override

public boolean next(listoutresults) throws ioexception

seeknext方法就是從keyprovider取得下乙個rowkey,然後跳到該rowkey

protected void seeknext() throws ioexception  else if (lastkeyvalue == null)  else 

}} while (true);

// seek the store heap to the next key

// (this is what makes the scanner faster)

getstoreheap().seek(keyvalue);

}

我感覺這種實現問題在於記憶體占用很高,而且不知道如果region如果load balance到其他region server上,還能不能保持索引和資料的一致性

HBase 實現二級索引

使用整合mapreduce的方式建立hbase索引。主要的流程如下 1.11.2 獲取rowkey和指定欄位名稱和字段值 1.3建立put例項,value rowkey,rowkey columnname columnvalue 1.4使用identitytablereducer將資料寫入索引表 類...

Hbase二級索引

hbase的查詢都是通過rowkey 要把多條件組合查詢的字段都拼接在rowkey中顯然不太可能 或者全表掃瞄再結合過濾器篩選出目標資料 太低效 所以通過設計hbase的二級索引來解決這個問題。多個查詢條件構成了多維度的組合查詢,需要根據不同組合查詢出符合條件的資料。例如 按照電影維度查詢資料適合,...

HBase二級索引的設計

摘要 最近做的乙個專案涉及到了多條件的組合查詢,資料儲存用的是hbase,恰恰hbase對於這種場景的查詢特別不給力,一般hbase的查詢都是通過rowkey 要把多條件組合查詢的字段都拼接在rowkey中顯然不太可能 或者全表掃瞄再結合過濾器篩選出目標資料 太低效 所以通過設計hbase的二級索引...