總體互動示意圖

叢集狀态更新
主要包含以下兩部分,分别代表叢集負載和region分布;
clusterMetrics
各個regionserver會定時上報其負載資料到master,并存放在ServerManager元件中,ClusterStatusChore每分鐘會将其連同其它資訊一起更新到LoadBalancer中,LoadBalancer會保留最近15次的資料,後續在進行ReadRequest、WriteRequest和MemStoreSize等相關計算時,可以根據這些曆史資料計算出最近一段時間的平均值;
clusterLoad
代表region在各個regionserver的配置設定情況,從AssignmentManager中擷取;
生成plan
所謂plan,就是一些action的集合,action的類型有AssignRegionAction、MoveRegionAction和SwapRegionsAction三種;
而action由CandidateGenerator産生,目前主要是以下幾種:
RandomCandidateGenerator
- 随機選擇2個server,1個稱為thisServer,另1個稱為otherServer;
- 對于region數量更多的那個server,随機選出1個region;
- 對于region數量更少的那個server,有50%機率選出0個region,有50%機率選出1個region;
- 如果第3步選出了0個region,則傳回MoveRegionAction,否則傳回SwapRegionsAction;
LoadCandidateGenerator
- 将所有server按regionCount排序;
- 找出region最多和最少的2個server;
- 後續步驟與RandomCandidateGenerator一緻;
LocalityBasedCandidateGenerator
- 将所有region打亂順序;
- 周遊這些region;
- 擷取目前這個region(稱為fromRegion)的mostLocalServer(稱為toServer),如果與目前所在server(稱為fromServer)一緻,則回到第2步,否則到下一步;
- 如果toServer的region數量小于平均值,則直接傳回一個MoveRegionAction,否則到下一步;
- 周遊toServer上的region(稱為toRegion),如果能找到一個region,與fromRegion交換可使得總體locality增加,則傳回一個SwapRegionsAction,否則回到第2步;
CandidateGenerator每次生成一個action,都會對其進行收益判斷,這個判斷涉及到很多因子,每一種都對應一個CostFunction的實作,目前有如下這些:
CostFunction可以了解為損失函數,取值區間為0到1,越接近最佳狀态,值越小;
對于MoveCostFunction來說,初始狀态就是最佳狀态,因為不需要任何移動,而移動所有region則是最差狀态;
而對于其它CostFunciton,則需要分别去考慮最差和最佳時的值具體是什麼,比如對于RegionCountSkewCostFunction,最差狀态是所有reigon都集中在單個regionserver上,而最佳狀态是所有regionserver上的region數量都等于平均數;
值得注意的是,對于ServerLocalityCostFunction及其它資料本地化相關因子來說,最佳狀态并非是完全本地化,而是基于目前hdfs的block分布狀态,所能達到的最大學地化值,
收益的判斷需要對doAction之前和之後的totalCost進行比較,而totalCost是對各個因子的cost權重求和得到的,如下所示,實線框為初始狀态時的cost,模拟執行了action之後得到了虛線框代表的cost,有的增加有的減小,最後綜合下來的增減情況就代表了執行該action是否有價值;
CandidateGenerator生成action的次數有一定限制,稱為maxStep,該值與叢集配置以及叢集規模相關;
執行plan
plan的執行本質上是執行一系列的MoveRegionProcedure,MoveRegionAction會對應一個MoveRegionProcedure,而SwapRegionsAction會對應兩個MoveRegionProcedure;
計劃執行時,會進行總體執行時間的限制,預設取balance執行間隔的值(hbase.balancer.max.balancing),即300s,另外,還可限制總體處于rit狀态的region的比例(hbase.master.balancer.maxRitPercent),預設為1.0,即不限制;
一些配置參數
判斷階段
1、hbase.master.balancer.stochastic.minCostNeedBalance
需要balance的最小cost,即與理想狀态的偏差,預設值為0.05;
1、hbase.master.balancer.stochastic.maxSteps
生成後選action的最大次數,預設值為1000000;
2、hbase.master.balancer.stochastic.runMaxSteps
該值本質上是用來決定把maxSteps作為上限還是作為下限,預設false,即作為上限;
(實際的最大步數,會由動态計算的一個值,與maxSteps進行比較,來選取一個)
3、hbase.master.balancer.stochastic.maxRunningTime
生成plan最多可用時間,預設值為30s;
4、hbase.master.balancer.stochastic.stepsPerRegion
預設800次,該參數會和region數量以及server數量相乘,來得到動态計算的step值;
cost計算相關
MoveCostFunction
1、hbase.master.balancer.stochastic.moveCost
moveCost權重,預設值為7;
2、hbase.master.balancer.stochastic.maxMovePercent
最大可移動的region比例,預設值為0.25;
3、DEFAULT_MAX_MOVES
常量值600,會與maxMovePercent得到的值取max,作為實際可移動數,這意味着max_moves至少為600;
4、當超出實際maxMove時,cost會傳回1個很大的值1000000,進而否決掉目前action;
RegionCountSkewCostFunction
1、hbase.master.balancer.stochastic.regionCountCost
regionCountCost權重,預設值為500;
CostFromRegionLoadFunction(abstract)
1、hbase.master.balancer.stochastic.numRegionLoadsToRemember
最多保留的曆史regionLoad數量,預設值為15,基于這些曆史load,會先算出每次的增量,然後取平均後作為實際load(适用于MemStoreSizeCostFunction、ReadRequestCostFunction、WriteRequestCostFunction);
MemStoreSizeCostFunction
1、hbase.master.balancer.stochastic.memstoreSizeCost
預設值為5;
StoreFileCostFunction
1、hbase.master.balancer.stochastic.storefileSizeCost
ReadRequestCostFunction
1、hbase.master.balancer.stochastic.readRequestCost
WriteRequestCostFunction
1、hbase.master.balancer.stochastic.writeRequestCost
ServerLocalityCostFunction
1、hbase.master.balancer.stochastic.localityCost
預設值為25;
RackLocalityCostFunction
1、hbase.master.balancer.stochastic.rackLocalityCost
預設值為15;
TableSkewCostFunction
1、hbase.master.balancer.stochastic.tableSkewCost
預設值為35;
PrimaryRegionCountSkewCostFunction
1、hbase.master.balancer.stochastic.primaryRegionCountCost
預設值為500;
RegionReplicaHostCostFunction
1、hbase.master.balancer.stochastic.regionReplicaHostCostKey
預設值為100000,主要識别region的各個副本集中到相同host的程度,權重很高,意味着基本上不允許出現;
RegionReplicaRackCostFunction
1、hbase.master.balancer.stochastic.regionReplicaRackCostKey
預設值為10000,主要識别region的各個副本集中到相同rack的程度,權重較高,意味着不贊成這種狀态;