hbase中相关命令行操作在服务端都是由相应的Procedure来执行完成的,并不是一个单独的操作,而是由其状态机中的一系列状态按照流程来完成的。特别的,我这次本着有图有真相的原则来为大家分析这一流程。
  这次,我们主要分析hbase在HMaster的初始化方法finishActiveMasterInitialization中,初始化Meta信息的InitMetaProcedure流程。以最新github分支上的hbase代码而言,对应下图中的:
  如图所示,在构造了InitMetaProcedure对象之后,ProcedureExecutor将其提交,而后,在ProcedureExecutor.pushProcedure方法中调用scheduler.addBack方法(此时的scheduler为MasterProcedureScheduler)。由于InitMetaProcedure间接实现了TableProcedureInterface接口,如下图所示:
  因此,会将该procedure加入任务队列tableRunQueue中。
  像其他许多框架(例如netty)的原理一样,这里必然是有一些线程在不断地轮询,直接或间接的从任务队列中获取任务。在我们当前分析的流程中,ProcedureExecutor.WorkerThread充当了这个角色。
  从后续源码中,我们很容易知道,接着依次调用ProcedureExecutor.executeProcedure,procedure.doExecute。特别的,在procedure.doExecute方法中,首先通过其抽象父类Procedure.doExecute,然后调用其抽象父类StateMachineProcedure.execute,最后调用InitMetaProcedure.executeFromState。由于InitMetaProcedure.getInitialState中获得的InitMetaProcedure的初始状态为InitMetaState.INIT_META_ASSIGN_META,因此会调用下面的addChildProcedure方法。
  特别的,方法内首先调用AssignmentManager.createAssignProcedures,AssignmentManager.createAssignProcedure,TransitRegionStateProcedure.assign等方法,构建了一个TRSP Procedure。并且初始化TRSP为初始状态为RegionStateTransitionState.REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE,
最终状态为RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED的 Procedure。
  然后通过调用addChildProcedure方法将刚刚构建的TRSP添加到其subProcList中。接着,回到了StateMachineProcedure.execute方法中,将刚刚构建好的subProcList以数组形式返回,一直到ProcedureExecutor.execProcedure。接着调用ProcedureExecutor.initializeChildren设置subprocs的ParentProcId、RootProcId与ProcId实现对subprocs与父procedure的关联。然后,由于subprocs不为空,调用submitChildrenProcedures,将刚刚创建的TRSP继续加入到scheduler的任务队列中。
  而后,在WorkerThread.run方法中继续轮询调用。接下来的流程与上面所述的大致相同,只是这次在执行Procedure.doExecute中调用到了TransitRegionStateProcedure.execute。而后才继续调用StateMachineProcedure.execute。接着就调用到了TransitRegionStateProcedure.executeFromState。根据下图所示,结合刚刚TRSP初始化时的状态,我们很容易便知道,TRSP将依次经过REGION_STATE_TRANSITION_GET_ASSIGN_CANDIDATE-->REGION_STATE_TRANSITION_OPEN-->REGION_STATE_TRANSITION_CONFIRM_OPENED,从而完成调用。
  首先是调用queueAssign,然后调用AssignmentManager.queueAssign,将TRSP加入到MasterProcedureScheduler的tableRunQueue之中,并将TRSP当前状态置为REGION_STATE_TRANSITION_OPEN。而后,在ProcedureExecutor.WorkerThread的轮询中继续调用scheduler.poll,这里获得状态为REGION_STATE_TRANSITION_OPEN的TRSP,也就是刚刚转换过来的TRSP(至于具体的流程,我们在下一节中具体分析)。接下来,我们继续经过相同的流程,来到TransitRegionStateProcedure.executeFromState,由于当前状态为REGION_STATE_TRANSITION_OPEN,故而调用openRegion方法。
  在openRegion方法内调用了AssignmentManager.regionOpening,更新了regionNode为OPENING,而后调用了addChildProcedure(new OpenRegionProcedure(getRegion(), loc)),并且将当前状态设置为REGION_STATE_TRANSITION_CONFIRM_OPENED。
  由于上面addChildProcedure方法的调用,因此在该TRSP的subProcList中多了一个OpenRegionProcedure类型的Procedure。紧接着返回到Procedure.execProcedure。
  由于其subprocs不为空,因此调用submitChildrenProcedures将OpenRegionProcedure加入到scheduler的调用队列中。OpenRegionProcedure的父类为RegionRemoteProcedureBase,因此,在接下来在Procedure.doExecute的调用中,会转到RegionRemoteProcedureBase.execute。
  特别的,在execute的执行流程中,涉及到客户端与服务端的调用,我们将详细讲述。
  如图所示,通过env.getRemoteDispatcher获取到RSProcedureDispatcher,调用其addOperationToNode方法。在addOperationToNode方法内调用node.add方法。
  特别注意上图的node类型为RemoteProcedureDispatcher.BufferNode,其add方法如下图所示:
  这里调用了timeoutExecutor.add方法,其中timeoutExecutor类型为TimeoutExecutorThread。这里我们只附一张图,详细流程将在下节叙述。
  略过这里,回到RegionRemoteProcedureBase.execute,该方法最后调用了event.suspendIfNotReady,将该procedure加入了ProcedureEvent.suspendedProcedures,最后间接的加入到轮询队列中。至此,CreateTableProcedure与TRSP依次调用下图中标亮的方法,从而完成InitMetaProcedure流程的完整调用。
  如果大家感觉不错,希望点一下下面的推荐。你的肯定是小编最大的动力。如果有疑问,也可以发送邮件至15935152719@163.com,期待你的来信。

hbase之InitMetaProcedure流程的更多相关文章

  1. HBase 数据读写流程

    HBase 数据读写流程 2016-10-18 杜亦舒 读数据 HBase的表是按行拆分为一个个 region 块儿,这些块儿被放置在各个 regionserver 中 假设现在想在用户表中获取 ro ...

  2. HBase数据存取流程

    一.HBase的特点是什么 1.HBase一个分布式的基于列式存储或者行式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理. 2.HBase适合存储半结构化或非结构化数据,对于 ...

  3. HBase - 数据写入流程解析

    本文由  网易云发布. 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻松 ...

  4. Hbase的读写流程

    HBase读写流程 1.HBase读数据流程 HRegionServer保存着meta表以及表数据,要访问表数据,首先Client先去访问zookeeper,从zookeeper里面获取meta表所在 ...

  5. Hbase负载均衡流程以及源码

    hmater负责把region均匀到各个region server .hmaster中有一个线程任务是专门处理负责均衡的,默认每隔5分钟执行一次. 每次负载均衡操作可以分为两步: 生成负载均衡计划表 ...

  6. HBase数据读写流程(1.3.1)

    ===数据写入流程=== 源码:https://github.com/apache/hbase/blob/master/hbase-server/src/main/java/org/apache/ha ...

  7. HBase Region Assign流程详解

    Hbase是kv存储,但是逻辑上我们可以把存储在hbase上的kv数据当成表,rowkey可以认为是表的主键.为了便于分布式操作,hbase会把表横向切分成一块一块的数据,而每块就是一个Region. ...

  8. HBase RegionServer Splitting 流程

    RegionServer Splitting 实现 HBase 中的写请求由 Region Server 处理,这些数据首先存储在 memstore (RegionServer 里的一个存储系统)里. ...

  9. Hbase数据读写流程

    From: https://blog.csdn.net/wuxintdrh/article/details/69056188 写操作: Client写入,存入Memstore,Memstore满则Fl ...

随机推荐

  1. [精华][推荐]CAS SSO 单点登录框架学习 环境搭建

    1.了解单点登录  SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用( ...

  2. JAVA实训第二次作业

    一维数组的创建和遍历. 声明并创建存放4个人考试成绩的一维数组,并使用for循环遍历数组并打印分数.要求: (1) 首先按"顺序"遍历,即打印顺序为:从第一个人到第四个人: (2) ...

  3. java将pdf文件转为word

    import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.Output ...

  4. java日期格式的常用操作

    顾晓北 | 大侠五级 |园豆:9353 | 2016-08-04 16:17     其他回答(1) 0 public class DateUtils extends PropertyEditorSu ...

  5. nohup 运行后台程序

    写了个程序,大概就是日志文件快写满的时候自动删日记.然后 java -jar  log_delete.jar  &  跑起来.过两天ps发现程序没有了, 网上一查明白是因为:通过终端(shel ...

  6. ios  国际化开发

    一,.xib 1.首先选中xib文件,在右边的inspector中选择对应的国际化语言,如下图

  7. 用jquery制作简易日历

    html代码如下: div align="center" id="divAll"> <table id="tab" border ...

  8. java(一) 基础部分

    1.11.简单讲一下java的跨平台原理 Java通过不同的系统.不同版本.不同位数的java虚拟机(jvm),来屏蔽不同的系统指令集差异而对外体统统一的接口(java API),对于我们普通的jav ...

  9. JObject,JArray的基本操作

    引用:https://www.cnblogs.com/dacongge/p/6957074.html 1.JObject:基本的json对象 /// <summary> /// Gets ...

  10. NGUI_创建图集Altas

    在project面板下创建一个名为Textures的folder,把事先准备好的贴图素材直接拖到Textures下 2.导航栏NGUI处打开atlas 3.project下新建一个atlas的文件夹, ...