HBase一個令人惋惜的地方,就是不支援二級索引。是以,社群有了很多補充方案來填補HBase的二級索引能力的缺陷。
今天,我們就來看看有哪些二級索引方案,通過對比各個方案的優缺點,并結合我們的具體場景做出二級索引方案選型。
1.為什麼需要二級索引
HBase系統單純從解決大資料實時讀寫問題角度出發,重點關注于分布式存儲的擴充性、容錯性、讀寫性能等方面,為此也犧牲了很多傳統關系型資料庫的功能,比如事務,SQL表達與分析等。
實際上,這是NoSQL最初的含義,以解決大資料的實時存取為首要目标,提供簡單的Get,Put,Scan接口,解決使用者的大資料量存儲的需求。是以,HBase完全是一個非常優秀的大資料實時存取引擎,解決了傳統資料庫的容量問題。
就目前官方的HBase系統來說,并不支援二級索引,隻有rowkey作為一級索引, 如果要對庫裡的非rowkey字段進行資料檢索和查詢, 往往要通過MapReduce/Spark等分布式計算架構進行,硬體資源消耗和時間延遲都會比較高。
為了HBase的資料查詢更高效、适應更多的場景, 諸如使用非rowkey字段檢索也能做到秒級響應,或者支援各個字段進行模糊查詢和多字段組合查詢等, 是以需要在原生HBase基礎上建構二級索引, 以滿足現實中更複雜多樣的業務需求。一般有以下三類方案:
- 基于HBase的Coprocessor的方案(典型代表phoenix)
- 雲廠商自研的二級索引(阿裡雲目前有自研增強版二級索引)
- 基于搜尋平台的索引方案(如solr、ES等)。
2.如何選擇二級索引方案
我們從讀寫性能、使用限制、學習成本、社群活躍等角度,對三類方案做對比。
基于HBase的Coprocessor的方案(典型代表phoenix)
- 官方文檔:http://phoenix.apache.org/secondary_indexing.html
- 讀寫性能:有一定讀寫性能損害,索引越多,寫入性能影響越大
- TTL功能:支援比較好
- 索引的使用限制:一個表的索引數不要超過10個
- 索引類型:全局索引、本地索引、覆寫索引
- 學習成本:類JDBC的sql文法,多參考官方的文法(http://phoenix.apache.org/language/index.html)
- 開源/社群活躍程度:開源,目前社群不太活躍
- 優點:社群文檔多、使用簡單、實時查詢無延遲
- 缺點:非商業化方案,沒有專門的技術支援
雲廠商自研的二級索引(典型代表阿裡雲自研增強版二級索引)
- 官方文檔:https://help.aliyun.com/document_detail/144577.html?spm=a2c4g.11174283.6.576.4999363f2uZWt0
- 讀寫性能:二級索引内置于HBase,官方的性能評測文檔說比Phoenix好
- TTL功能:隻能在單列索引上生效
- 索引的使用限制:一個表的索引個數最多不超過5個、組合索引的列最多不要超過3個
- 索引類型:全局索引、本地索引、覆寫索引
- 學習成本:内部封裝的很簡單,在使用上就是HBase的原生用法
- 開源/社群活躍程度:非開源、阿裡雲私有
- 優點:性能好、實時查詢無延遲
- 缺點:被雲廠商鎖定
基于搜尋平台的二級索引方案(以Solr為例)
- 官方文檔:http://phoenix.apache.org/secondary_indexing.html
- 讀寫性能:有一定讀寫性能損害、資料同步的延遲需要考慮
- TTL功能:HBase是單個KV過期,而Solr中隻能按照Document(對應HBase的一行)過期,過期的時間不完全一緻
- 索引的使用限制:沒有限制,完全取決于solr
- 索引類型:非常靈活
- 學習成本:需要熟悉solr文法
- 開源/社群活躍程度:開源 社群活躍
- 優點:查詢方式更加靈活
- 缺點:引入搜尋引擎元件、太重了,而且有明顯的延遲問題
總結一下**(特别重要的技術選型政策)**:
- 為了不被雲廠商鎖定,是以不采用雲廠商獨有的二級索引方案
- 對于實時性要求高、索引數量少的場景,完全可以使用phoenix,簡單而又絲滑
-
對于實時性要求不高、搜尋場景比較複雜的,需要引入搜尋引擎,如solr或者es進行索引建構
一般來說,為了滿足實時需求,我們會使用phoenix。
3.簡單了解下phoenix
為了讓HBase更強大,更好用,門檻更低,讓HBase幫助更多的使用者解決他們遇到的實際問題。于是,phoenix帶着SQL誕生了。衆所周知,SQL是資料處理領域的語言标準,簡單,好用,表達力強,使用者使用廣泛。當然,HBase SQL的實作和發展跟傳統單機資料庫有很多不同,便于差別,我們稱之為NewSQL。這也是社群嘗試HBase二級索引的初衷,如果說HBase是功能強大的存儲引擎,那麼支援NewSQL之後,就變成了新一代的大飛機。
Phoenix作為應用層和HBASE之間的中間件,以下特性使它在大資料量的簡單查詢場景有着獨有的優勢
- 二級索引支援(global index + local index)
- 編譯SQL成為原生HBASE的可并行執行的scan
- 在資料層完成計算,server端的coprocessor執行聚合
- 下推where過濾條件到server端的scan filter上
- skip scan功能提高掃描速度
下一期,我們将結合實踐,來說明phoenix的原理和最佳實踐,敬請期待!
看到這裡了,原創不易,點個贊吧,你最好看了~
知識碎片重新梳理,建構Java知識圖譜:https://github.com/saigu/JavaKnowledgeGraph (曆史文章查閱非常友善)