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寫數據流程
- Client先訪問zookeeper,從meta表獲取相應region信息,而後找到meta表的數據
- 根據namespace、表名和rowkey根據meta表的數據找到寫入數據對應的region信息
- 找到對應的regionserver
- 把數據分別寫到HLog和MemStore上一份
- MemStore達到一個閾值後則把數據刷成一個StoreFile文件。(若MemStore中的數據有丟失,則能夠從HLog上恢復)
- 當多個StoreFile文件達到必定的大小後,會觸發Compact合併操做,合併爲一個StoreFile,(這裏同時進行版本的合併和數據刪除。)
- 當Storefile大小超過必定閾值後,會把當前的Region分割爲兩個(Split),這裏至關於把一個大的region分割成兩個region,並由Hmaster分配到相應的HRegionServer,實現負載均衡。
2.2 HBase讀數據流程
- Client先訪問zookeeper,從zookeeper中找到meta表region的位置,而後讀取meta表中的數據。meta中又存儲了用戶表的region信息。
- 根據namespace、表名和rowkey在meta表中找到對應的region信息
- 找到這個region對應的regionserver
- 查找對應的region
- 先從MemStore找數據,若是沒有,再到StoreFile上讀(爲了讀取的效率)。