HBase二級索引、讀寫流程


HBase二級索引、讀寫流程







HBase自己只提供基於行鍵和全表掃描的查詢,而行鍵索引單一,對於多維度的查詢困難.
二級索引的本質就是創建各列值與行鍵之間的映射關係。html

1、HBse二級索引方案

1.1 基於Coprocessor方案

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

ApachePhoenix在目前開源的方案中,是一個比較優的選擇。主打SQL on HBase , 基於SQL能完成HBase的CRUD操做,支持JDBC協議。 Apache Phoenix在Hadoop生態裏面位置:在這裏插入圖片描述負載均衡

1.2 Phoenix二級索引特色

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

二級索引的本質就是:創建各列值與行鍵之間的映射關係ide

大致都是遵循相似的思路:構建一份「索引」的映射關係,存儲在另外一張hbase表或者其餘DB裏面。函數

1.3 Phoenix 二級索引方案

先創建一張映射到Phoenix的表,接着採用全局二級索引oop

CREATE TABLE LJK_TEST (ID VARCHAR NOT NULL PRIMARY KEY,"mycf"."name" VARCHAR)CREATE INDEX COVER_LJKTEST_INDEX ON LJKTEST(name);

2、HBase讀寫流程

2.1 HBase寫數據流程

  1. Client先訪問zookeeper,從meta表獲取相應region信息,而後找到meta表的數據
  2. 根據namespace、表名和rowkey根據meta表的數據找到寫入數據對應的region信息
  3. 找到對應的regionserver
  4. 把數據分別寫到HLog和MemStore上一份
  5. MemStore達到一個閾值後則把數據刷成一個StoreFile文件。(若MemStore中的數據有丟失,則能夠從HLog上恢復)
  6. 當多個StoreFile文件達到必定的大小後,會觸發Compact合併操做,合併爲一個StoreFile,(這裏同時進行版本的合併和數據刪除。)
  7. 當Storefile大小超過必定閾值後,會把當前的Region分割爲兩個(Split),這裏至關於把一個大的region分割成兩個region,並由Hmaster分配到相應的HRegionServer,實現負載均衡。

2.2 HBase讀數據流程

  1. Client先訪問zookeeper,從zookeeper中找到meta表region的位置,而後讀取meta表中的數據。meta中又存儲了用戶表的region信息。
  2. 根據namespace、表名和rowkey在meta表中找到對應的region信息
  3. 找到這個region對應的regionserver
  4. 查找對應的region
  5. 先從MemStore找數據,若是沒有,再到StoreFile上讀(爲了讀取的效率)。
相關文章
相關標籤/搜索