HBase提供了檢索數(shù)據(jù)的功能趣效,不過原有系統(tǒng)僅提供了通過rowkey檢索數(shù)據(jù)的功能糟红,過于單一艾帐,不夠靈活乌叶,一旦查詢條件改變了,往往涉及到要全表掃描過濾柒爸,極大浪費機器物理資源准浴,又達不到實時效果;HBase二級索引功能解決了原有HBase系統(tǒng)中僅能夠通過rowkey檢索數(shù)據(jù)的問題捎稚,使得用戶能夠指定多種條件乐横,在HBase表中進行數(shù)據(jù)的實時檢索與統(tǒng)計,提供了強大的數(shù)據(jù)檢索功能今野。
HBase只提供了一個基于字典序的主鍵索引葡公,在查詢中只能通過行鍵或掃描全表來獲取數(shù)據(jù)。如下圖条霜,需求是查找符合F:C1=C11的F:C2的值催什,因為不知道rowkey,所以就需要掃描全表蛔外,但是如果這時候蛆楞,我們新建一張索引表,這張表的rowkey是F:C1的value(C11,C12,C13)夹厌,column列是源表中的C11對應(yīng)的rowkey(RK1)豹爹,這時候,再查詢就可以先從索引表中根據(jù)rowkey查到RK1矛纹,然后使用RK1去原表中查找value臂聋。這樣性能會提高很多
實現(xiàn)方案一:使用HBase Coprocessor協(xié)處理器
CoProcessor相當于HBase的Observer+hook,目前支持MasterObserver或南、RegionObserver和WALObserver孩等,基本上對于HBase Table的管理、數(shù)據(jù)的Put/Delete/Get等操作都可以找到對應(yīng)的pre*和post采够。這樣如果需要對于某一項Column建立Second indexing肄方,就可以在Put/delete的時候,將其信息更新到另外一張索引表中蹬癌。對于Indexing里面的value值是否存儲的問題权她,可以根據(jù)需要進行控制,如果value的空間開銷不大逝薪,逆向的檢索又比較繁瑣隅要,可以直接存儲在Indexing table中,反之則避免這種情況董济。
實現(xiàn)方案二:由客戶端發(fā)起對主表和索引表的Put步清、Delete操作的雙重操作
1、設(shè)置主表的TTL(Time To Live)比索引表小一點,讓其略早一點消亡
2廓啊、不要在IndexingTable存儲value值
3欢搜、Put操作時,對于操作的主表的所有列谴轮,先使用同一的Local TimeStamp的值更新到IndexIng Table狂巢,然后使用該TimeStamp插入主表數(shù)據(jù)
4、Delete操作時书聚,首先操作主表的數(shù)據(jù),然后再去更新Indexing Table的數(shù)據(jù)
實現(xiàn)方案三:Phoenix
Phoenix是一個開源的HBASE SQL層藻雌。它不僅可以使用標準的JDBC API替代HBASE client API創(chuàng)建表雌续,插入和查詢HBASE,也支持二級索引胯杭、事物以及多種SQL層優(yōu)化;
可以參考https://yq.aliyun.com/articles/574090