版本:hbase 0.94.15-cdh4.7.0
運作hregionserverstarter類啟動hregionserver:
hregionserver類繼承關系如下:

主要包括:
設定服務端hconnection重試次數
檢查壓縮編碼,通過hbase.regionserver.codecs可以配置編碼類,一一檢測,判斷是否支援其壓縮算法。
擷取usehbasechecksum值,是否開啟hbase checksum校驗
擷取<code>hbase.regionserver.separate.hlog.for.meta</code>參數值
擷取用戶端重複次數
擷取threadwakefrequency值
擷取<code>hbase.regionserver.msginterval</code>值
建立sleeper對象,用于周期性休眠線程
擷取最大掃描結果集大小,<code>hbase.client.scanner.max.result.size</code>,預設無窮大
擷取<code>hbase.regionserver.numregionstoreport</code>值
擷取rpctimeout值,<code>hbase.rpc.timeout</code>,預設60000
擷取主機名和綁定的ip和端口,端口預設為60020
建立rpcserver
zk授權登入和hbase授權
建立regionserveraccounting
建立cacheconfig
preregistrationinitialization
initializezookeeper,此方法不會建立任何節點 - 建立zookeeperwatcher - 建立masteraddresstracker 并等到”/hbase/master”節點有資料為止 - 建立clusterstatustracker 并等到”/hbase/shutdown”節點有資料為止 - 建立catalogtracker 不做任何等待 - 建立regionserversnapshotmanager
設定叢集id
初始化線程:initializethreads - 建立 cacheflusher - 建立 compactsplitthread - 建立 compactionchecker - 建立 periodicflusher - 建立 healthcheckchore - 建立 leases - 判斷是否啟動 hregionthriftserver
參數<code>hbase.regionserver.nbreservationblocks</code>預設為4,預設會預留20m(每個5m,20m = 4*5m)的記憶體防止oom
初始化rpcengine = hbaserpc.getprotocolengine(conf)
reportforduty,輪詢,向彙報master自己已經啟動
getmaster(),取出”/hbase/master”節點中的資料,構造一個master的servername,然後基于此生成一個hmasterregioninterface接口的代理,此代理用于調用master的方法
regionserverstartup
當輪詢結果不為空時,調用handlereportfordutyresponse - regionserverstartup會傳回來一個mapwritable,這個mapwritable有三個值,這三個key的值會覆寫rs原有的conf: - “hbase.regionserver.hostname.seen.by.master” = master為rs重新定義的hostname(通常跟rs的inetsocketaddress.gethostname一樣)rs會用它重新得到servernamefrommasterpov - “fs.default.name” = “file:///” - “hbase.rootdir” = “file:///e:/hbase/tmp” - 檢視conf中是否有”mapred.task.id”,沒有就自動設一個(格式: “hb_rs_“+servernamefrommasterpov),例如: hb_rs_localhost,60050,1323525314060 - createmyephemeralnode:在zk中建立 短暫節點”/hbase/rs/localhost,60050,1323525314060”,也就是把目前rs的servernamefrommasterpov(為null的話用rs的inetsocketaddress、port、startcode建構新的servername)放到/hbase/rs節點下,”/hbase/rs/localhost,60050,1323525314060”節點沒有資料 - 設定fs.defaultfs值為hbase.rootdir的值 - 生成一個隻讀的fstabledescriptors - 調用setupwalandreplication - 初始化 hlog、metrics、dynamicmetrics、rshost - 調用startservicethreads啟動服務線程 - 啟動一些executorservice - 啟動hlogroller - 啟動cacheflusher - 啟動compactionchecker - 啟動healthcheckchore - 啟動periodicflusher - leases.start() - 啟動jetty的infoserver,預設端口為60030 - 啟動複制相關打的一些handler:replicationsourcehandler、replicationsourcehandler、replicationsinkhandler - rpcserver啟動 - 建立并啟動splitlogworker
registermbean
snapshotmanager啟動快照服務
在master上注冊之後,進入運作模式,周期性(msginterval預設3妙)調用dometrics,tryregionserverreport
ishealthy健康檢查,隻要leases、memstoreflusher、logroller、periodicflusher、compactionchecker有一個線程退出,rs就停止
dometrics
tryregionserverreport向master彙報rs的負載hserverload
shutdown之後的一些操作
unregistermbean - 停掉thriftserver、leases、rpcserver、splitlogworker、infoserver、cacheconfig
中斷一些線程:cacheflusher、compactsplitthread、hlogroller、metahlogroller、compactionchecker、healthcheckchore
停掉napshotmanager
停掉 catalogtracker、compactsplitthread
等待所有region關閉
關閉wal
删除zk上的一些臨時節點,zookeeper關閉
總結一下,hregionserver主要幹以下事情:
在zk上注冊自己,表明自己上線了
跟master彙報
設定wal和複制
注冊協作器regionservercoprocessorhost
啟動hlogroller
定期重新整理memstore
定期檢測是否需要壓縮合并
啟動租約
啟動jetty的infoserver
建立splitlogworker,用于拆分hlog
快照管理
hregionserver類中建立了一些對象:
hbaseserver:處理用戶端請求
leases:租約
infoserver:jetty伺服器
regionservermetrics:
regionserverdynamicmetrics:
compactsplitthread:合并檔案線程
memstoreflusher:重新整理memstore線程
兩個chore:compactionchecker、periodicflusher
兩個logroller:hlogroller、metahlogroller
masteraddresstracker:跟蹤master位址
catalogtracker:跟蹤-root-和.meta.表
clusterstatustracker:跟蹤叢集狀态
splitlogworker:拆分log
sleeper:
executorservice:
replicationsourceservice和replicationsinkservice:複制服務
regionserveraccounting:
cacheconfig:緩存配置和block
regionservercoprocessorhost:regionserver協作器
healthcheckchore:健康檢查