HRegionServer是HBase中最主要的組件,負責table數據的實際讀寫,管理Region。在分布式集群中,HRegionServer一般跟DataNode在同一個節點上,目的是實現數據的本地性,提高讀寫效率。
0.94之后的HRegionServer:圖片來自Map-R網站
0.94之前的HRegionServer
HBase結構
1 RegionServer中的組件
1.1 WAL:Write Ahead Log
1.1.1 主要特點
- 為一個文件
- 0.94之前叫做HLog,存儲在/hbase/.logs/目錄中
- 0.94之后存儲在HDFS上的/hbase/WALs/{HRegionServer_name}中
- 記錄RegionServer上的所有編輯信息(Puts/Deletes操作,屬于哪個Region),在寫到memstore之前
- 理論上一個RegionServer上只有一個WAL實例,數據操作為串行,造成性能瓶頸
- 用于RegionServer失效時,通過Replay恢復RegionServer上memstore中尚未持久化的數據
1.1.2 多WAL實例
- HBase1.0 之后,通過使用底層HDFS的多管道實現了多WAL并行寫入,提高了吞吐量
- 并行化是通過對多個Region進行分區實現的,如果只有一個Region,那么該方案無效
- 通過在hbase-site.xml中配置,然后重啟RegionServer
<property>
<name>hbase.wal.provider</name>
<value>multiwal</value>
</property>
1.1.3 WAL Splitting :分組
- 將WAL按照Region進行分組的過程稱為WAL Splitting。這對于Region Server掛掉數據恢復來說是一個非常關鍵的過程。
- 該操作是在集群啟動時HMaster執行或者RS失效時執行的
- 涉及到Region在此操作完成之前是不可用的
- 流程請看文章后面
1.1.4 WAL Replay :重播
可查看 3.4 WAL Repaly 流程
1.2 MemStore
- 寫緩存,數據先寫到MemStore,flush觸發后刷新到磁盤
- 以KeyValue的形式存儲在內存當中
- 當MemStore flush觸發時,屬于同一Region的所有MemStore會刷新到磁盤中
- 是Region中的重要組成部分,詳細請查看Region詳解
1.3 BlockCache
- 讀緩存,數據被讀取之后仍然緩存在內存中
- 有LruBlockCache(效率較高,GC壓力大)和BucketCache(效率較低,沒有GC壓力)兩種BlockCache,默認為LruBlockCache
- 每個RegionServer中只有一個BlockCache實例
1.3.1 HBase 'Block'
- HBase讀寫中的最小單元
- 有四種類型的block:DATA、INDEX、BLOOM和META
- DATA:存儲用戶數據
- INDEX:用于提高讀取速度,為DATA BLOCK中的cell建立索引
- BLOOM:用于提高讀取速度,用bloom filter過濾掉不包含需求數據的block
- META:存儲HFile本身數據和元數據
詳細信息請看 BlockCache資料
1.4 Region
- HBase表格根據row key 劃分成“Regions”。
- 一個Region包含該表格中從起始key到結束key之間的所有行。
- Region由Store組成。
- Regions會被分配到集群中稱為“Region Servers”的節點
詳細信息請看Region詳解
2 RegionServer的主要功能
- 定期向Master匯報RS的情況,包括RS內存使用狀態、在線狀態的Region等信息
- 管理Region,執行Flush、Compaction、Open、Close、Load等操作
- 管理WAL
- 執行數據插入、更新和刪除操作
- Metrics:對外提供了衡量HBase內部服務狀況的參數
- 內置HttpServer,提供訪問RS的界面
3 RegionServer的主要流程
3.1 首次讀寫流程
- Client從ZooKeeper中讀取hbase:meta表
- Clinet從hbase:meta獲取想要操作的Region的位置信息,緩存hbase:meta在Client中,用于后續的操作
- Client向目標Region所在的RegionServer發送請求,執行操作
- 當一個region因為Master執行負載均衡或者RegionServer掛掉而執行的重定位之后,Client需要重新讀取hbase:meta進行緩存
首次讀寫流程,圖片來自Map-R網站
3.2 寫流程
- Client提交一個Put請求到RegionServer,數據首先會寫到WAL中
- 當數據寫到WAL之后,數據會寫到MemStore中,等待刷新到磁盤中
- 數據寫到MemStore完成之后,RS會給Client發送確認信息
寫流程(一),圖片來自Map-R
寫流程(二),圖片來自Map-R
3.3 讀流程
- 首先掃描BlockCache(讀緩存)中尋找row cell,若沒有則執行2
- 掃描MemStore(寫緩存)中尋找row cell,若沒有則執行3
- HBase會使用BlockCache索引和bloom filters來加載那包含目標row cells的HFile到內存
讀流程,圖片來自Map-R
3.4 WAL Splitting 流程
- 對/hbase/WALs/<host>,<port>,<startcode> 目錄進行重命名
- 改成:/hbase/WALs/<host>,<port>,<startcode>-splitting
- 當RS被HMaster被認為失效的時候,它可能仍然在運行,所以為了保證已經存在的有效的數據
- 讀取WAL中的Edits信息根據region將屬于不同region的edits寫到對應的/hbase/<table_name>/<region_id>/recovered.edits/.temp(臨時文件),當splitting完成后,臨時文件名稱會修改為寫入該文件的第一個log信息的序列號
- 在Splitting完成后,涉及到的Region會被分配新的RegionServer,那么在新的RegionServer打開Region時會檢查recovered.edits目錄下是否有edits文件,如果有則讀取edits寫入到MemStore中,寫入完成后刷新到HFile中并刪除edits文件。
3.4 WAL Repaly 流程
- WAL Replay流程依賴于WAL Splitting流程
- WAL Replay流程實際上就是WAL Splitting流程中第三步
- WAL Replay是在打開Region時完成的
WAL Replay,圖片來自Map-R
參考資料
BlockCache
Apache HBase ? Reference Guide
An In-Depth Look at the HBase Architecture
深入分析RegionServer
若有侵權,請聯系我