Hbase是kv存储,但是逻辑上我们可以把存储在hbase上的kv数据当成表,rowkey可以认为是表的主键。为了便于分布式操作,hbase会把表横向切分成一块一块的数据,而每块就是一个Region。为了提供在线服务,我们必须把Region加载到集群中的某台机器上,这个加载的过程正是region assign要做的。顺便说一句,hbase中把表切分region和HDFS中文件切分成block,Spark中RDD切分成partitions的思想都是一样的。

region assgin的流程

region assgin涉及到client,master,regionserver以及zk之间的交互。主要步骤如下:

1,client向master发送AssignRegion的RPC请求后(如当在hbase shell中运行assign命令),master响应该服务的入口函数为:

 public AssignRegionResponse assignRegion(RpcController controller,
AssignRegionRequest req) throws ServiceException {
...
//检查master端服务是否启动以及已经初始化
master.checkInitialized();
//协处理器preAssign
... //核心,使用AssignmentManager做region assignment
master.assignmentManager.assign(regionInfo, true, true);
//协处理器postAssign
...
}

入口函数调用的assgin函数主要实现如下:

 public void assign(HRegionInfo region,
boolean setOfflineInZK, boolean forceNewPlan) {
//检查该table是否处于disable或者disabling状态
//如果是,则忽略此次assign操作,并且如果该region处于RS_ZK_REGION_CLOSED,
//M_ZK_REGION_OFFLINE状态,则删除RIT下该节点
//另外,还会将master中该region相关的数据结构(RegionStates)的状态做相应设置
if (isDisabledorDisablingRegionInRIT(region)) {
return;
}
String encodedName = region.getEncodedName();
//貌似主要是锁住该region对应的状态
Lock lock = locker.acquireLock(encodedName);
try {
//根据该region当前的状态,进行相关预操作和过滤,
//比如,如果region处于FAILED_CLOSE和FAILD_OPEN状态会先进行unassign操作
//最终使得region处于offline状态
forceRegionStateToOffline(region, forceNewPlan); //尝试maximumAttempts(默认10次),首先获取RegionPlan,
//然后设置zk下RIT对应region的状态为M_ZK_REGION_OFFLINE
//一切准备就绪后,master会设置regionStates为PENDING_OPEN状态,并且
//向RegionServer发送OpenRegion请求
assign(state, ...);
}
} finally {
lock.unlock();
}
}

2,ReionServer响应OpenRegion的请求函数如下:

public OpenRegionResponse openRegion(final RpcController controller,
final OpenRegionRequest request) throws ServiceException {
...
//正常情况下,会交由OpenRegionHanlder来处理
regionServer.service.submit(new OpenRegionHandler(
regionServer, regionServer, region, htd, masterSystemTime, coordination, ord));
...
//打开后设置状态返回
builder.addOpeningState(RegionOpeningState.OPENED);
}

而OpenRegionHandler中open region的核心代码process函数中:

 public void process() throws IOException {
...
//transitionFromOfflineToOpening会将zk中该region的状态从M_ZK_REGION_OFFLINE状态设置成RS_ZK_REGION_OPENING状态
if (useZKForAssignment
&& !coordination.transitionFromOfflineToOpening(reg...) //打开open region,细节暂时忽略
openRegion() //transitionToOpened将zk中该region的状态从RS_ZK_REGION_OPENING设置成
//RS_ZK_REGION_OPENED
if (!isRegionStillOpening() ||
(useZKForAssignment && !coordination.transitionToOpened(region, ord))) {
}

3,接下来,再看看Master监控到zk中region状态变化的相应情况:

 void handleRegion(final RegionTransition rt, OpenRegionCoordination coordination,
OpenRegionCoordination.OpenRegionDetails ord) {
//当zk的状态变成RS_ZK_REGION_OPENING,设置regionStates的状态为OPENING
case RS_ZK_REGION_OPENING:
regionStates.updateRegionState(rt, State.OPENING); //正如注释所言,剔除中间状态,删除zk RIT结点,RegionStates设置为OPEN
case RS_ZK_REGION_OPENED:
// Handle OPENED by removing from transition and deleted zk node
regionStates.transitionOpenFromPendingOpenOrOpeningOnServer(...); }

小结

通过上面的分析,Region Assgin过程中主要的状态和步骤,大概可以用下图来概括。

未来

从上面的分析可知,当前region assgin的流程还是非常复杂的,所有很容易就造成Meta表和master,zk中的状态不一致,从而使Region处于RIT状态。社区正在做这方面的优化,主要思想就是去掉zk依赖,从而只依赖master和regionserver。具体详情可参看: https://blogs.apache.org/hbase/entry/hbase_zk_less_region_assignment 。 预计在hbase 2.0中将包含该功能。

HBase Region Assign流程详解的更多相关文章

  1. 大数据Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  2. Hadoop核心架构HDFS+MapReduce+Hbase+Hive内部机理详解

    转自:http://blog.csdn.net/iamdll/article/details/20998035 分类: 分布式 2014-03-11 10:31 156人阅读 评论(0) 收藏 举报 ...

  3. tp6源码解析-第二天,ThinkPHP6编译模板流程详解,ThinkPHP6模板源码详解

    TP6源码解析,ThinkPHP6模板编译流程详解 前言:刚开始写博客.如果觉得本篇文章对您有所帮助.点个赞再走也不迟 模板编译流程,大概是: 先获取到View类实例(依赖注入也好,通过助手函数也好) ...

  4. C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解

    之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...

  5. [nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)

    :由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作.为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) . ...

  6. 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解

    本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...

  7. Linux启动流程详解【转载】

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  8. Faster RCNN原理分析(二):Region Proposal Networks详解

    Faster RCNN原理分析(二):Region Proposal Networks详解 http://lib.csdn.net/article/deeplearning/61641 0814: A ...

  9. iOS 组件化流程详解(git创建流程)

    [链接]组件化流程详解(一)https://www.jianshu.com/p/2deca619ff7e

随机推荐

  1. 积跬步,聚小流------ps有用小技巧,改变png图标颜色

    *  实现效果: 原图:  改动后: *  实现目的: 满足为实现不同界面色彩搭配改动png图标的颜色 *  实现方法: 1.打开Photoshop工具,导入须要进行改动的png图标: 2.对导入的图 ...

  2. 【Mongodb教程 第十一课 】MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

  3. Linux Grub系统加密、破密、修复

    一.在重新启动系统时候按任意键进入 grub界面  Grub加密 一.title前的密码 修改grub.conf 这种加密只是在用户要进入grub界面的时候提示要输入密码,但是可以正常进入系统,有没有 ...

  4. js将月份转换为英文简写的形式

    本文通过代码实例介绍一下如何实现将月份转换为英文简写的形式. 比如将一月份转换为Jan,需要的朋友可以做一下参考. 代码实例如下: [JavaScript] 纯文本查看 复制代码运行代码 1 2 3 ...

  5. Servlet的引入

    一.分析 此模式有问题: 1.jsp需要呼叫javabean StudentService stuService = new StudentServiceImpl(); List<Student ...

  6. 偶遇HiWork,请不要擦肩而过

    非常多朋友可能都不了解HiWork,在这里介绍一下. HiWork是基于云存储的团队即时沟通协作平台,主要针对于中小团队及中小企业的即时沟通,让团队沟通更顺畅.在HiWork平台可即时得知所使用第三方 ...

  7. HBase 数据迁移

    最近两年负责 HBase,经常被问到一些问题, 本着吸引一些粉丝.普及一点HBase 知识.服务一点阅读人群的目的,就先从 HBase 日常使用写起,后续逐渐深入数据设计.集群规划.性能调优.内核源码 ...

  8. click event not triggered on bootstrap modal

    I am trying to catch the click event when save changes is pushed. For some reason i can't catch the ...

  9. 【Selenium】idea导入eclisp项目的问题

    ①导入:file→new→Project from exiting 选择ecliesp 然后next就可以 ②添加依赖:每个包都要加,引用其他包的类,也要添加依赖 setting选择junit4

  10. 关于python语言使用redis时,连接是否需要关闭的问题

    python操作完redis,需要关闭连接的吧,怎么关闭呢 1人赞 回复 君惜丶: redis-server会关闭空闲超时的连接redis.conf中可以设置超时时间:timeout 300 2017 ...