12 HBase
文章目錄
- 12 HBase
- 12.1 HBase存儲結構
- 12.2 HBase的寫流程
- 12.3 HBase的讀流程
- 12.6 HBase的合并
- 12.7 RowKey設計原則
- 12.8 RowKey如何設計
- 12.9 HBase二級索引原理
12.1 HBase存儲結構
架構角色:
1)Master
實現類為HMaster,負責監控集群中所有的 RegionServer 實例。主要作用如下:
(1)管理元數據表格hbase:meta,接收用戶對表格創建修改刪除的命令并執行
(2)監控region是否需要進行負載均衡,故障轉移和region的拆分。
通過啟動多個后臺線程監控實現上述功能:
①LoadBalancer負載均衡器
周期性監控region分布在regionServer上面是否均衡,由參數hbase.balancer.period控制周期時間,默認5分鐘。
②CatalogJanitor元數據管理器
定期檢查和清理HBase:meta中的數據。meta表內容在進階中介紹。
③MasterProcWAL Master預寫日志處理器
把Master需要執行的任務記錄到預寫日志WAL中,如果Master宕機,讓backupMaster讀取日志繼續干。
2)Region Server
Region Server實現類為HRegionServer,主要作用如下:
(1)負責數據cell的處理,例如寫入數據put,查詢數據get等
(2)拆分合并Region的實際執行者,有Master監控,有regionServer執行。
3)Zookeeper
HBase通過Zookeeper來做Master的高可用、記錄RegionServer的部署信息、并且存儲有meta表的位置信息。
HBase對于數據的讀寫操作時直接訪問Zookeeper的,在2.3版本推出Master Registry模式,客戶端可以直接訪問Master。使用此功能,會加大對Master的壓力,減輕對Zookeeper的壓力。
4)HDFS
HDFS為HBase提供最終的底層數據存儲服務,同時為HBase提供高容錯的支持。
12.2 HBase的寫流程
寫流程:
寫流程順序正如API編寫順序,首先創建HBase的重量級連接
(1)讀取本地緩存中的Meta表信息;(第一次啟動客戶端為空)
(2)向ZK發起讀取Meta表所在位置的請求;
(3)ZK正常返回Meta表所在位置;
(4)向Meta表所在位置的RegionServer發起請求讀取Meta表信息;
(5)讀取到Meta表信息并將其緩存在本地;
(6)向待寫入表發起寫數據請求;
(7)先寫WAL,再寫MemStore,并向客戶端返回寫入數據成功。
12.3 HBase的讀流程
創建連接同寫流程。
(1)讀取本地緩存中的Meta表信息;(第一次啟動客戶端為空)
(2)向ZK發起讀取Meta表所在位置的請求;
(3)ZK正常返回Meta表所在位置;
(4)向Meta表所在位置的RegionServer發起請求讀取Meta表信息;
(5)讀取到Meta表信息并將其緩存在本地;
(6)MemStore、StoreFile、BlockCache
同時構建MemStore與StoreFile的掃描器,
MemStore:正常讀
StoreFile:
根據索引確定待讀取文件;
再根據BlockCache確定讀取文件;
(7)合并多個位置讀取到的數據,給用戶返回最大版本的數據,如果最大版本數據為刪除標記,則不給不返回任何數據。
12.6 HBase的合并
Compaction分為兩種,分別是Minor Compaction和Major Compaction。
12.7 RowKey設計原則
(1)rowkey長度原則
(2)rowkey散列原則
(3)rowkey唯一原則
12.8 RowKey如何設計
1)使用場景:
大量用戶信息保存在HBase中。
2)熱點問題:
由于用戶的id是連續的,批量導入用戶數據后,很有可能用戶信息都集中在同一個region中。如果用戶信息頻繁訪問,很有可能該region的節點成為熱點。
3)期望: 通過對Rowkey的設計,使用戶數據能夠分散到多個region中。
4)步驟:
(1)預分區
通過命令
create 'GMALL:DIM_USER_INFO','INFO',SPLITS=>['20','40','60','80']
把用戶信息表(GMALL:DIM_USER_INFO) 分為5個region : [00-20), [20-40), [40-60), [60-80), [80-99]
(2)寫入時反轉ID
把用戶ID左補零10位(根據最大用戶數),然后反轉順序。
比如:用戶id為1457,反轉處理后變為7541000000; 根據前兩位分到region [60-80),
用戶id為1459,反轉處理后變為9541000000;根據前兩位分到 region [80-99]
這樣連續的用戶ID反轉后由于Rowkey開頭并不連續,會進入不同的region中。
最終達到的效果可以通過Web UI進行觀察:
如上圖,用戶數據會分散到多個分區中。
注意:在用戶查詢時,也同樣根據需要把ID進行反轉后進行查詢。
12.9 HBase二級索引原理
1)原理
協處理器:協助處理數據,可以在向原始表中寫入數據之后向索引表中寫入一條索引數據。
2)種類及用法
(1)全局 讀多寫少
單獨創建表專門用于存儲索引,索引表數據量比原始表小,讀取更快速。但是寫操作會寫兩張表的數據,跨Region,需要多個連接。
(2)本地 寫多讀少
將索引數據與原表放在一起(Region),加在一起比原表數據量大,讀取相對變慢,但是由于在一個Region,所以寫操作兩條數據用的是同一個連接。