首先,让我们来到HMaster的main方法。我们今天的流程就从这里开始。


接下来,让我们来到HMasterCommandLine.run方法


在HMasterCommandLine.startMaster方法开始,有判断LocalHBaseCluster.isLocal(conf),也就是我们在hbase-site.xml中是否配置了hbase.cluster.distributed(默认为false)。这里我们只分析值为true的情形。其主要通过方法如下图所示:


在构建HMaster的过程中,最主要的又两个方法,其中一个是下图所示调用了其父类HRegionServer的构造方法,还有一个在下面的第二章图中有显示,也就是构建了ActiveMasterManager。其中ActiveMasterManager主要是用来处理master端与master选举相关的一切,我们简单略过。只是介绍HRegionServer的构造方法。


HRegionServer的构造方法也比较长,下面通过三张图来展示:以下分别用RSG1、RSG2、RSG3来表示。


接下来让我们来到NettyEventLoopGroupConfig的构造方法,如下图所示,在构造方法内部,构造了Netty中的eventLoopGroup,为后面的rpc调用准备条件。


关于RSG1中的Sleeper,我们这里留一个疑问,等到HMaster真正运行的时候,他的威力才显示出来。而这个sleeper造成困扰小编很久的疑问。
接下来,让我们来到RSG2的,这是HMaster或HRegionServer在构造的重量级方法。由于我们这里只介绍HMaster,因此来到HMaster覆写的createRpcServices中,显然,在这里构建了MasterRpcServices。

我们可以看到,HMaster在构造时调用了其父类的构造方法RSRpcServices。


接下来,我们来到RSRpcServices构造方法的主体,下图将比较关键的地方框选的出来。在第一个框中,获取了即将构建的rpcServer的ip与端口(默认为16000)。在第二个框中构建了NettyRpcServer(注意,这框中的rpcSchedulerFactory其类型为SimpleRpcSchedulerFactory)。


然后,我们来到MasterRpcServices.createRpcServer,如下图所示,在这里主要构建了SimpleRpcScheduler。上面我们已经说到rpcSchedulerFactory类型为SimpleRpcSchedulerFactory。因此,在这里调用的方法是SimpleRpcSchedulertory.create。也就是调用了SimpleRpcScheduler的构造方法。由于SimpleRpcScheduler比较重要,我们在下图就略作介绍。


来到SimpleRpcScheduler的构造方法。在这里主要构建了下面三个RpcExecutor,而这三个RpcExecutor就是以后用来处理客户端请求的Executor。这里只是这三个Executor的构建,在后面的启动流程中,仍然会提到。


RpcExecutor的内容先告一段落。接下来, 让我们来到NettyRpcServer的构造方法中,由于上一步骤中使用的rpcSchedulerFactory类型为SimpleRpcSchedulerFactory,因此,这里传入的scheduler类型为SimpleRpcScheduler,也就是上面所说的。
在NettyRpcServer的构造方法中,首先调用了其父类的构造方法,其中值得留意的是将传入的scheduler保存到了成员变量中,其它初始化的内容我们这里就不赘述了。然后来到第二个框中的内容,这里的getEventLoopGroupConfig获得的对象正是HRegionServer在构造一开始调用setupNetty获得的。忘记的同学可以看看往上面翻翻。
接下来,在第三个框中,熟悉netty的同学可能就很清楚了,在这里构造了netty的服务端对象,最后,绑定了服务端端口并开始监听。
在这里需要关注下面的一个方法createNettyRpcServerPreambleHandler。在这个方法中创建了NettyRpcServerPreambleHandler,而这个handler也就是我将要在下一节介绍的完整rpc流程中服务端处理的第一个Handler。这里只是简单提一下,希望各位同学有一点印象。


看到这里,大家可以缓一口气,比较主要的服务端监听已经开始了。但是,这并不意味着HMaster就可以处理HRegionServer或客户端发送来的请求了。这里先留一个小的疑问。在后面的内容中,我将会为大家一一道来。接下来的内容依然很多,要往下读的同学需要鼓足勇气了。
上面已经为各位同学介绍了RSG2中的createRpcServices,下面简单介绍一下RSG2中的initializeFileSystem方法。在这里初始化了两个HFileSystem。


下面,来到RSG3中ZKWatcher的构造方法,如下图所示。其中,首先获取到配置中的zookeeper信息,然后封装了hbase中存储在ZK中的路径信息,接着,通过ZKUtil.connect构建了一个RecoverableZooKeeper对象,而在RecoverableZooKeeper的构造方法中创建了与ZK的连接。最后,将刚刚封装好的hbase路径在ZK上创建。


本节另外一个比较重要的方法就是RSG3中的rpcServices.start,而我在上面抛出的疑问也将在这里解答。
来到RSRpcServices.start方法,由于我并没有配置Authorization的有关信息,因此,在这里,主要调用了rpcServer.start。还记得在上面创建的rpcServer的类型吗。没错,就是在上面通过反射方式创建的NettyRpcServer。


下面,来到NettyRpcServer.start方法。有安全相关的认证在这里先跳过,直接来到scheduler.start。我相信大家可能已经忘记了这里的scheduler的类型。往上面翻一翻就可以知道,这里的scheduler类型为SimpleRpcScheduler。


来到SimpleRpcScheduler.start。各位同学时候还记得在这里的各个executor的类型,没错,他们的类型都是FastPathBalancedQueueRpcExecutor,下面我就分析一下其中start的奥秘。下面所框选的内容都比较关键,有余力的同学可以看一下,在后面的章节中我也会提到。

这里的RpcExecutor实际类型为FastPathBalancedQueueRpcExecutor。

因而,来到FastPathBalancedQueueRpcExecutor,可以看到,返回的对象类型为FastPathHandler。在构造好FastPathHandler对象之后,调用了start方法。FastPathHandler继承自Handler。再往下看。

来到Handler类,看到其继承自Thread,并且覆写了Thread的run方法。也就是说,在上面调用start方法的时候,这里的run方法开始运行。由于Handler的实际类型为FastPathHandler,因此,在真正运行时,下图调用的getCallRunner为FastPathHandler.getCallRunner。比较关心的同学可以自己看一下。在这一节重点并不是这里,就点到为止了。

到现在为止,rpcServices的启动完成了,并且HMaster就可以处理HRegionServer或客户端发送来的请求了。各位同学可能还不清楚为什么。我在这里通过下面的图来简单介绍一下。客户端请求到服务端后,来到这里,将通过调用scheduler.dispatch,这里的sceduler也就是我在前面提到的SimpleRpcScheduler。由于刚刚handler已经启动完成,所有dispath后的所有请求,都可以由handler处理,而在上面,handler还没有启动,所以还没有办法处理。我在上面抛出的疑问也就解决了。至于以后的流程,我将在下一节详细介绍,欢迎大家关注。
在RSG3中,然后创建了ChoreService。很多同学可能会对ChoreService不太清楚。其实ChoreService就是对很多继承自ScheduledChore的周期性调用。在ChoreService内部有一个周期性调度线程池ScheduledThreadPoolExecutor。在实例化时其真正类型一般是JitterScheduledThreadPoolExecutorImpl。而ScheduledChore是通过ChoreService调度激活的任务。ScheduledChore在ChoreService中调度运行时会与ChoreService中其他ScheduledChores竞争访问ChoreService线程池中的线程。
接着创建了ExecutorService,注意这里的并非java中的ExecutorService,而是org.apache.hadoop.hbase.executor.ExecutorService。后面在HMaster调用startServiceThreads时会用到。
到此,HMaster的构建完成了。
- HBase——HMaster启动之二(HMaster线程的调用)
紧接着上一节HMaster的构建完成.接下来会调用HMaster调用master.start(),master.join(). 由HMaster的继承关系,很明显,他是Runnable的子类.也就是说 ...
- Hbase master启动报错:Failed construction of Master: class org.apache.hadoop.hbase.master.HMaster Caused by: java.net.UnknownHostException:
Hbase master启动报错: java.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop ...
- hmaster 启动后自动关闭
hbase重装后,hmaster却起不来,多次启动也不行,后来发现原因是在zookeeper中之前注册的hmaster仍然存在,系统中只允许一个hmaster运行.解决方法如下: 进入zk客户端,将h ...
- 【HBase】知识小结+HMaster选举、故障恢复、读写流程
1:什么是HBase HBase是一个高可靠性,高性能,面向列,可伸缩的分布式数据库,提供海量数据存储功能,一个结构化的分布式存储系统,不同于一般的关系型数据库,它适合半结构化和非结构化数据存储. 2 ...
- Hbase设置多个hmaster
Hbase设置多个hmaster https://www.cnblogs.com/prayer21/p/4866673.html
- HBase配置&启动脚本分析
本文档基于hbase-0.96.1.1-cdh5.0.2,对HBase配置&启动脚本进行分析 date:2016/8/4 author:wangxl HBase配置&启动脚本分析 剔除 ...
- Ambari部署HDP:HBase Master启动后自动消失
这是第一次出勤部署产品.遇到不可控问题,解决,写个心得.记录一下吧^^ 在排查问题的过程中,学到不少知识. (1)centos系统盘和数据盘分开,装操作系统的人没有将IT的空间分配出来,所以分区,自动 ...
- HBase Master启动过程
master启动过程: -->首先初始化HMaster -->创建一个rpcServer,其中并启动 -->启动一个Listener线程,功能是监听client的请求,将请求放入ni ...
- Hadoop、Hbase —— 服务启动、验证、停止
一.Hadoop 1.启动Hadoop cd /usr/local/hadoop-2.7.3/sbin ./start-dfs.sh 启动过程如下: 2.验证Hadoop是否启动成功 2.1.在主节 ...
随机推荐
- Linux sleep 语句以及循环 测试负载
sleep 命令 sleep 1 睡眠1秒sleep 1s 睡眠1秒sleep 1m 睡眠1分sleep 1h 睡眠1小时 总代码 #!/bin/bash for i in {1. ...
- cmd下的一些小技巧
切换盘符:[盘符]+: tips1: 在盘符A执行一条命令后的同时切换到盘符B:A:\>dir && B:(此处只能用&&或者&) tips2: 在盘符A ...
- linux下安装srilm
1.安装相关依赖库 a.c/c++ compiler:编译器gcc 3.4.3及以上版本 b.GNU make:构建和管理工程的工具,解释Makefile里的指令,描述了整个工程所有文件的编译顺序 ...
- python实现简单动画——生命游戏
生命游戏 生命游戏的宇宙是一个无限的,其中细胞的二维正交网格,每个细胞处于两种可能的状态之一,即*活着*或*死亡*(分别是*人口稠密*和*无人居住*).每个细胞与它的八个邻居相互作用,这八个邻居是水平 ...
- 分布式文件系统 fastdfs搭建
fastdfs第一步:在home文件夹下建立tar文件夹第二步:cd /home/tar///(Libevent 是一个用C语言编写的.轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( e ...
- C++程序调用python3
今天想做一个简单的管理密码的小程序,由于最近了解了下Python,就想用Python来写.但是看了看Python的界面库用法有感觉有点麻烦,所以还不如直接使用MFC写写界面,关于csv的文件处理部分使 ...
- LOJ-10094(强连通分量)
题目链接:传送门 思路: 先缩点,然后统计入度为0的点即可. #include<iostream> #include<cstdio> #include<cstring&g ...
- 第一次OO总结
作业1——多项式加减法 看到这个名字就开始瑟瑟发抖了,毕竟一年前用C语言让我写这么一个程序都很头疼,什么堆栈啊还有结构都稀里糊涂的,更别说用一个完全没接触过的语言来完成最简单的一次作业.像我这样越老心 ...
- WSGI协议以及对服务器的影响
下面的内容纯属个人学习心得,如果对于我的观点有疑问,敬请留言,我将虚心向大牛学习. WSGI的全称是WEB SERVICE GATEWAY INTERFACE.WSGI 不是服务器,不是API,也不是 ...
- matplotlib&numpy画图
import numpy as np import matplotlib.pyplot as plt x=np.linspace(0,6,100) y=np.cos(2*np.pi*x)*np.exp ...