天天看點

「從零單排HBase 11」HBase二級索引解決方案1.為什麼需要二級索引2.如何選擇二級索引方案3.簡單了解下phoenix

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 (曆史文章查閱非常友善)