hbase region 分配方式

参与 Region 分配的重要对象

在 Region 分配过程当中,起着重要做用有以下一些对象。安全

 

  •  HMaster— 是 HBase 中的 Master server ,仅有一个。
  • HRegionServer--- 负责多个 HRegion 使之能向 client 端提供服务,在 HBase cluster 中存在多个HRegionServer 。

 

 

  •  ServerManager--- 负责管理 Region server 信息,好比每一个 Region server 的 HServerInfo( 这个对象包含HServerAddress 和 startCode), 已 load Region 个数,死亡的 Region server 列表

   

  •   RegionManager --- 负责将 region 分配到 region server 的具体工做,还有监视 root 和 meta 这 2 个特殊 region的状态。
  • RootScanner --- 按期扫描 root region ,以发现没有分配的 meta region 。
  • MetaScanner--- 按期扫描 meta region, 以发现没有分配的 user region 。

 

这些对象的关系如图所示:负载均衡

 

  

Region 分配过程

 

  • Root region 的分配

 

HMaster 起动时,首先会经过 RegionManager 把 rootRegionLocation (里面包含 HServerAddress )的值置为null ,而后把 root region 从待处理 region 列表中移除(若是有的话),而后从新将其放入待处理 region 列表(regionsInTransition ),并将其状态设置为 UNASSIGNED( 未分配 ).函数

 

当一个 Region server 启动完成时,它会调用 reportForDuty 函数向 HMaster 报告它的启动,报告固然是经过HMasterRegionInterface 的 regionServerStartup 方法。而后 HMaster 会把 Region server 的报告转交给ServerManager 的 regionServerStartup 方法处理。 ServerManager 会将这个新的 RegionServer 加入 region server 列表而且把它的 server load 设为空闲的。线程

 

RegionServer 会按期发送报告给 HMaster ,请求 HMaster 进一步的指示。发送报告是经过HMasterRegionInterface 的 regionServerReport 方法。 HMaster 接到报告后,移交报告给 ServerManager 的regionServerReport 方法处理。 ServerManager 会查询server

regionServer 的状态,获得一个 HServerInfo 对像,而后检查 RegionServer 是否为正常的。若是为正常的话,ServerManager 会查询 regionserver 的负载( HServerLoad ),更新一个 loadToServers 的 map 。而后进入ServerManager 的 processMsgs 函数处理。对象

 

ServerManager 会检查该 regionServer 的已经打开的 region 的数目,若是打开的 region 数目少于一个固定的值(对应配置文件中的 hbase.regions.nobalancing.count ),而后就会调用 RegionManager 的 assignRegions 方法。ip

 

RegionManager 会向 ServerManager 查询,如今已启动的 RegionServer 有几个,若是只有一个的话,会作特别处理。ci

 

而后 RegionManager 调用本身的 regionsAwaitingAssignment 方法去取得等待分配的 region 集合。它先会特别考虑 root region ,若是它查到 root region 还没有被分配,它会立刻返回只包含 root region 的集合。it

 

若是没有任何 region 未分配的话并且并未处在安全模式, RegionManager 会让 loadBalancer 执行负载均衡的动做(就是可能把该 regionserver 负责的 region 分一点出去)。 反之若是有待分配的 region ,serverManager 会调用本身的 assignRegionsToMultipleServers方法。io

 

在 assignRegionsToMultipleServers 中,参数 regionsToAssign 是全部待分配的 region 集合,由于存在多个regionServer, 因此 regionManager 会考虑到多个 regionServer 的负载。 regionManager 会先调用regionsToGiveOtherServers 方法,求出其余 regionServer (好比相对负载较轻的)应该承载的 region 数目,那么当前 regionServer 可能承载的 region 个数就是待分配的 region 总数目减去其余 regionServer 应该承载的region 数目,这个数量咱们暂称之为 N 。若是 N<=0 而且 Meta Region 若是已被分配的话,该 regionServer 会被略过,不会被要求承载 region 。由于比当前 regionServer 的负载轻的 regionServer 个数超过了待分配的region 个数,轮不到当前的 regionServer 。

 

看起来快水落石出了,可是剩下事情还有点复杂。 regionManager 还会调用 computeNextHeaviestLoad 方法,算出 cluster 中有多少 regionServer 负载超过当前的 regionServer ,这个数目咱们暂称之为 NS ,同时该方法会抓出负载最重的 server 的负载。

 

接着 regionManager 会求出当前 regionServer 负责的 region 数目和负载最重的 regionServer 负责的 region 数目之间的差值。若是这个差值大于 N ,那么 N 个 region 将所有会交由当前 regionServer 负责。反之这个差值小于N,若是 NS 大于零,当前 regionServer 要被分配的 region 数量为 (int)Math.ceil(1.0*N/1.0*NS), 若是 NS 等于零,那么当前 regionServer 要被分配 region 的数量为 (int)Math.ceil(1.0*N/1.0*regionServer 总数 ) 。

 

 

而后 root region 就会被分配到该 RegionServer 上。

 

这里特别要提下:若是有多个 region serve 存在, HBase 不会把 root region 和 meta region 分配到一个RegionServer 上。

 

 

  • Meta region 的分配

 

一旦 root region 被分配完成, RootScanner 线程将被唤醒。而后它会 scan root region 。

 

在 scan 过程当中,碰到每一个 meta region 条目,它会调用 checkAssigned 函数检查,该 meta region 是否被分配,若是没有的话, regionManager 将会记录之,把该 region 加入待分配的 region 列表中。

 

一旦有 RegionServer 按期报告来了, meta region 会像 root region 同样的方式被分配。

 

 

  • User region 的分配

 

一旦 meta region 被分配完成, MetaScanner 将被唤醒,而后它会 scan  meta region 。

 

在 scan 过程当中,碰到每一个 user region 条目,它会调用 checkAssigned 函数检查,该 user region 是否被分配,若是没有的话, regionManager 将会记录之,把该 region 加入待分配的 region 列表中。

 

一旦有 RegionServer 按期报告来了, user region 会被分配。

相关文章
相关标签/搜索