参与 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 会查询

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

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

RegionManager 会向 ServerManager 查询,现在已启动的 RegionServer 有几个,如果只有一个的话,会做特别处理。

然后 RegionManager 调用自己的 regionsAwaitingAssignment 方法去取得等待分配的 region 集合。它先会特别考虑 root region ,如果它查到 root region 尚未被分配,它会马上返回只包含 root region 的集合。

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

在 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 会被分配。

hbase region 分配方式的更多相关文章

  1. HBase Region重点剖析

    Region的概念 Region是HBase数据管理的基本单位.数据的move,数据的balance,数据的split,都是按照region来进行操作的. region中存储这用户的真实数据,而为了管 ...

  2. 【原创】大叔问题定位分享(13)HBase Region频繁下线

    问题现象:hive执行sql报错 select count(*) from test_hive_table; 报错 Error: java.io.IOException: org.apache.had ...

  3. C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等.在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用.和堆一样 ...

  4. [转]详述DHCP服务器的三种IP分配方式

    DHCP就是动态主机配置协议(Dynamic Host Configuration Protocol),它的目的就是为了减轻TCP/IP网络的规划.管理和维护的负担,解决IP地址空间缺乏问题.这种网络 ...

  5. c/c++内存分配方式(转)

    原文链接:http://blog.csdn.net/jing0611/article/details/4030237 1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在 程序编译 ...

  6. 探讨C++ 变量生命周期、栈分配方式、类内存布局、Debug和Release程序的区别

    探讨C++ 变量生命周期.栈分配方式.类内存布局.Debug和Release程序的区别(一) 今天看博客园的文章,发现博问栏目中有一个网友的问题挺有趣的,就点进去看了下,标题是“C++生存期问题”,给 ...

  7. C中内存分配方式[转载]

    在C 中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 一.简介: 1.栈,就是那些由编译器在需要的时候分配,在无需的时候自动清除的变量的存储区.里面的变量通常是局部变 ...

  8. Hbase 备份的方式

    HBase 备份的方式有三种: 1.下线备份 (1)停止集群. (2)Distcp (3)restore 2.在线备份 -replication 3.在线北大 -CopyTable 4.在线备份-Ex ...

  9. 内存分配方式,堆区,栈区,new/delete/malloc/free

    1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...

随机推荐

  1. CSS中.和#区别

    一.问题来源 制作导航栏,参考别人的代码,发现的. 二.解析 2.1 概述 id:用来定义页面中大的样式,如栏目划分,顶部,正文,底部等:用#top的形式来定义: class:用来定义一些比较细节的样 ...

  2. 桌面小部件----LED电子时钟实现

    桌面控件是通过 Broadcast 的形式来进行控制的,因此每个桌面控件都对应于一个BroadcastReceiver.为了简化桌面控件的开发,Android 系统提供了一个 AppWidgetPro ...

  3. EntityFramework 插件之EntityFramework.Extended (批量处理)

    接手了一个用EF来做的项目,由于项目中使用的原生处理,导致很多update都是采用先select 后 update的方式来实现,同时无法批量执行逻辑如:根据订单类型统一更新状态等.所以在经过了N多查找 ...

  4. cppunit官方文档浅析

    使用doxygen生成官方文档 cppunit使用了doxygen作为它的文档建设工具,所以我们要找的“官方文档”,其实就在cppunit的代码里面. 请先参考博文<下载doxygen>( ...

  5. 使用XSLT实现Word下载

    Xslt是Extensible Stylesheet Language Transformations的缩写,用来将XML 文档转换到其它文档类型.XSLT的使用包括两个输入文件: – 包含实际数据的 ...

  6. Oracle sqlplus 语法

    目录: 0. FREFACE 1. 执行一个SQL脚本文件 2. 对当前的输入进行编辑 3. 重新运行上一次运行的sql语句 4. 将显示的内容输出到指定文件 5. 关闭spool输出 6.显示一个表 ...

  7. validator 对象

    validate方法返回Validator对象,Validator对象有很多种有用的方法: Validator.form()验证表单是否有效,返回true/false Validator.elemen ...

  8. Android 之 自定义标签 和 自定义组件

    1    自定义标签 这是我的模板项目目录     既然想像 android:text  那样使用自己的标签,那么首先得有标签. 在 res/values/ 下我新建了个 mm_tag.xml (切记 ...

  9. Java基础知识强化之IO流笔记03:throws的方式处理异常

    1. 什么时候使用throws ? (1)定义功能方法时候,需要把出现的问题暴露出来,让调用者去处理.那么就通过throws在方法上标识. (2)有时候,我们是可以对异常进行处理的,但是又有些时候,我 ...

  10. Android(java)学习笔记254:ContentProvider使用之内容观察者(观察发出去的短信)

    1.新建一个案例如下: 2. 不需要添加权限,同时这里布局文件不做修改,来到MainActivity,如下: package com.itheima.sendsmslistener; import a ...