上帝視角Hbase二級索引方案全解析


  • 什么是二級索引
  • Coprocessor
    協處理器類型
  • Coprocessor方案(Phoenix等)
    Phoenix二級索引特點
  • 非Coprocessor方案
    Lily HBase Indexer
    CDH Search
  • 其他方案

什么是二級索引

HBase中的一級索引指數據在寫入region時,會根據rowkey進行排序后寫入,之后regionserver在加載region時,會自動為當前region的rowkey創建一個LSM樹的索引,方便對當前region,rowkey的查詢。

那么問題來了。HBase本身只提供基於行鍵和全表掃描的查詢,而行鍵索引單一,對於多維度的查詢困難。

二級索引的本質就是建立各列值與行鍵之間的映射關系。

Coprocessor

在講解如何構建二級索引前,我們有必要簡單介紹一下Coprocessor這個核心特性。

在舊版本的(<0.92)Hbase中,統計數據表的總行數,需要使用Counter 方法,執行一次MapReduce Job才能得到。雖然HBase在數據存儲層中集成了MapReduce,能夠有效用於數據表的分布式計算。然而在很多情況下,做一些簡單的相加或者聚合計算的時候,如果直接將計算過程放置在server 端,能夠減少通訊開銷,從而獲得很好的性能提升。

在這種情況下,協處理器(Coprocessor)應運而生。它允許你將業務計算代碼放入在RegionServer的協處理器中,將處理好的數據再返回給客戶端,這可以極大地降低需要傳輸的數據量,從而獲得性能上的提升。同時協處理器也允許用戶擴展實現HBase目前所不具備的功能,如權限校驗、二級索引、完整性約束等。

於是,HBase在0.92版本之后引入了協處理器(coprocessors),實現了一些激動人心的新特性:能夠輕易建立二次索引、復雜過濾器(謂詞下推)以及訪問控制等。

協處理器類型

1. Observer協處理器

類似於傳統數據庫中的觸發器,當發生某些事件的時候這類協處理器會被 Server 端調用。

Observer Coprocessor 就是一些散布在 HBase Server 端代碼中的 hook 鈎子,在固定的事件發生時被調用。比如:put 操作之前有鈎子函數prePut,該函數在 put 操作執行前會被Region Server調用;在 put 操作之后則有postPut `鈎子函數。

當前Observer協處理器有下面4種類型:

  • RegionObserver:允許您觀察 Region 上的事件,例如 Get 和 Put 操作;
  • RegionServerObserver:允許您觀察與 RegionServer 操作相關的事件,例如啟動、停止或執行合並、提交或回滾。
  • WALObserver:提供 WAL 相關操作鈎子;
  • MasterObserver:提供 DDL-類型的操作鈎子。如創建、刪除、修改數據表等。

以上四種類型的 Observer 協處理器均繼承自Coprocessor接口;這四個接口中分別定義了所有可用的鈎子方法以便在對應方法前后執行特定的操作。通常情況下我們並不會直接實現上面接口而是繼承其Base實現類,Base 實現類只是簡單空實現了接口中的方法,這樣我們在實現自定義的協處理器時就不必實現所有方法只需要重寫必要方法即可。

下面是以RegionObserver為例子講解Observer這種協處理器的原理:

  • 客戶端發起get請求
  • 該請求被分派給合適的RegionServer和Region
  • coprocessorHost攔截該請求,然后在該表上登記的每個RegionObserer上調用preGet()
  • 如果沒有被preGet攔截,該請求繼續送到Region,然后進行處理
  • Region產生的結果再次被coprocessorHost攔截,調用postGet()處理
  • 假如沒有postGet()攔截該響應,最終結果被返回給客戶端

2. Observer協處理器

Endpoint協處理器類似傳統數據庫中的存儲過程,客戶端可以調用這些 Endpoint協處理器執行一段Server端代碼,並將Server端代碼的結果返回給客戶端進一步處理,最常見的用法就是進行聚集操作;

如果沒有協處理器,當用戶需要找出一張表中的最大數據,即max 聚合操作,就必須進行全表掃描,在客戶端代碼內遍歷掃描結果,並執行求最大值的操作。這樣的方法無法利用底層集群的並發能力,而將所有計算都集中到 Client 端統一執 行,勢必效率低下。

利用Coprocessor,用戶可以將求最大值的代碼部署到HBase Server端,HBase 將利用底層cluster的多個節點並發執行求最大值的操作。即在每個 Region 范圍內 執行求最大值的代碼,將每個Region的最大值在Region Server端計算出,僅僅將該 max 值返回給客戶端。在客戶端進一步將多個Region的最大值進一步處理而找到其中的最大值。這樣整體的執行效率就會提高很多。

3. 總體來看

Observer允許集群在正常的客戶端操作過程中可以有不同的行為表現
Endpoint允許擴展集群的能力,對客戶端應用開放新的運算命令
Observer類似於 RDBMS 中的觸發器,主要在服務端工作
Endpoint類似於 RDBMS 中的存儲過程,主要在服務端工作
Observer可以實現權限管理、優先級設置、監控、ddl 控制、二級索引等功能
Endpoint可以實現 min、max、avg、sum、distinct、group by 等功能

基於上面的基本知識,Hbase二級索引的實現主要分為2種: Coprocessor方案和非Coprocessor方案。

Coprocessor方案(Phoenix等)

其實從0.94版本開始,HBase官方文檔已經提出了hbase上面實現二級索引的一種路徑:

基於Coprocessor(0.92版本開始引入,達到支持類似傳統RDBMS的觸發器的行為)開發自定義數據處理邏輯,采用數據"雙寫"(dual-write)策略,在有數據寫入同時同步到二級索引表。

雖然官方一直也沒提供內置的支持二級索引的工具, 不過業界也有些比較知名的基於Coprocessor的開源方案:

華為的hindex: 基於0.94版本,當年剛出來的時候比較火,但是版本較舊,看GitHub項目地址最近這幾年就沒更新過。

Apache Phoenix: 功能圍繞着SQL on hbase,支持和兼容多個hbase版本, 二級索引只是其中一塊功能。二級索引的創建和管理直接有SQL語法支持,使用起來很簡便, 該項目目前社區活躍度和版本更新迭代情況都比較好。

Apache Phoenix在目前開源的方案中,是一個比較優的選擇。主打SQL on HBase, 基於SQL能完成HBase的CRUD操作,支持JDBC協議。Apache Phoenix在Hadoop生態里面位置:

Phoenix二級索引特點

  • Covered Indexes(覆蓋索引) :把關注的數據字段也附在索引表上,只需要通過索引表就能返回所要查詢的數據(列),所以索引的列必須包含所需查詢的列(SELECT的列和WHRER的列)。
  • Functional indexes(函數索引):索引不局限於列,支持任意的表達式來創建索引。
  • Global indexes(全局索引):適用於讀多寫少場景。通過維護全局索引表,所有的更新和寫操作都會引起索引的更新,寫入性能受到影響。在讀數據時,Phoenix SQL會基於索引字段,執行快速查詢。
  • Local indexes(本地索引):適用於寫多讀少場景。在數據寫入時,索引數據和表數據都會存儲在本地。在數據讀取時,由於無法預先確定region的位置,所以在讀取數據時需要檢查每個region(以找到索引數據),會帶來一定性能(網絡)開銷。

優點: 基於Coprocessor的方案,從開發設計的角度看,把很多對二級索引管理的細節都封裝在的Coprocessor具體實現類里面,這些細節對外面讀寫的人是無感知的, 簡化了數據訪問者的使用。

缺點: 但是Coprocessor的方案入侵性比較強, 增加了在Regionserver內部需要運行和維護二級索引關系表的代碼邏輯等, 對Regionserver的性能會有一定影響。

非Coprocessor方案

選擇不基於Coprocessor開發,自行在外部構建和維護索引關系也是另外一種方式。
常見的是采用底層基於Apache Lucene的Elasticsearch(下面簡稱ES)或Apache Solr ,來構建強大的索引能力、搜索能力, 例如支持模糊查詢、全文檢索、組合查詢、排序等。

Lily HBase Indexer

Lily HBase Indexer(也簡稱 HBase Indexer)是國外的NGDATA公司開源的基於solr的索引構建工具,特色是其基於HBase的備份機制,開發了一個叫SEP工具,通過監控HBase 的WAL日志(Put/Delete操作),來觸發對solr集群索引的異步更新,基本對HBase無侵入性(但必須開啟WAL)流程圖如下所示:

CDH Search

CDHSearch是Hadoop發行商Cloudera公司開發的基於solr的HBase檢索方案,部分集成了Lily HBase Indexer的功能。

下面是CDH search的核心組件交互圖, 體現了在單次client端查詢過程中, 核心的zookeeper和solr等的交互流程:

例如, Hbase結合Solr的場景:

基於Solr的HBase多條件查詢原理很簡單,將HBase表中涉及條件過濾的字段和rowkey在Solr中建立索引,通過Solr的多條件查詢快速獲得符合過濾條件的rowkey值,拿到這些rowkey之后在HBASE中通過指定rowkey進行查詢。

其他方案

對於在外部自定義構建二級索引的方式,有自己的大數據團隊的公司一般都會針對自己的業務場景進行優化,自行構建ES/Solr的搜索集群。例如基於ES構建海量索引和檢索能力的案例:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM