天天看點

HBase源碼:HRegionServer啟動過程構造方法run方法總結

版本:hbase 0.94.15-cdh4.7.0

運作hregionserverstarter類啟動hregionserver:

hregionserver類繼承關系如下:

HBase源碼:HRegionServer啟動過程構造方法run方法總結

主要包括:

設定服務端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:健康檢查

繼續閱讀