RegionServer詳解

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 讀流程

  1. 首先掃描BlockCache(讀緩存)中尋找row cell,若沒有則執行2
  2. 掃描MemStore(寫緩存)中尋找row cell,若沒有則執行3
  3. HBase會使用BlockCache索引和bloom filters來加載那包含目標row cells的HFile到內存
讀流程,圖片來自Map-R

3.4 WAL Splitting 流程

  1. /hbase/WALs/<host>,<port>,<startcode> 目錄進行重命名
  • 改成:/hbase/WALs/<host>,<port>,<startcode>-splitting
  • 當RS被HMaster被認為失效的時候,它可能仍然在運行,所以為了保證已經存在的有效的數據
  1. 讀取WAL中的Edits信息根據region將屬于不同region的edits寫到對應的/hbase/<table_name>/<region_id>/recovered.edits/.temp(臨時文件),當splitting完成后,臨時文件名稱會修改為寫入該文件的第一個log信息的序列號
  2. 在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

若有侵權,請聯系我

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容