HBase之HRegionServer启动(含与HMaster交互)
让我们来到reportForDuty方法中。在下图中我已经将其中的重点框选出来。其中的第一个方法是HRegionServer作为与HMaster交互的重点。我在本节将详细讲述。至于第二个方法,相信我在仔细描述第一个方法之后,大家就会感觉清晰明了。首先来到createRegionServerStatusStub方法。由于是长图,所以没有办法编辑,还请大家谅解。
首先,来到masterAddressTracker.getMasterAddress方法。这个MasterAddressTracker在HRegionServer构造时创建并启动,他所监听的ZK上的路径是/hasse/master。refresh为true,这里强制去ZK上查询HMaster的信息。然后调用了rpcClient.createBlockingRpcChannel。这里的rpcClient是在preRegistrationInitialization方法中构造的。
由于在rpcClient.createBlockingRpcChannel方法中仅仅返回了新构造的BlockingRpcChannelImplementation,因此,让我们来到BlockingRpcChannelImplementation的构造方法。这里,我特别标明了BlockingRpcChannel,这个类的完整名称是org.apache.hbase.thirdparty.com.google.protobuf.BlockingRpcChannel。这是由于hbase中将protobuf加入了其第三方包中。其真正类名应该是com.google.protobuf.BlockingRpcChannel。不论如何,他都是PB中的一个接口。这里的BlockingRpcChannelImplementation重写了接口中的callBlockingMethod方法,也就是说,在实际调用的时候,真正调用了rpcClient.callBlockingMethod方法。
接着,我们回到HRegionServer.createRegionServerStatusStub方法中。由上面的那张长图可以看到,由rpcClient.createBlockingRpcChannel返回的对象传入了RegionServerStatusService.newBlockingStub、LockService.newBlockingStub中,构造了这两个service的本地stub。这是PB的基础用法,与HDFS中对于PB的使用方式不用。这里封装的并不是很好。接着,将这两个service赋给HRegionServer的成员变量。
让我们继续深入ServerManager.regionServerStartup,由于其只是调用了ServerManager.checkAndRecordNewServer方法,并没有其它重点内容,我在这里就不贴图了。而是来到ServerManager.checkAndRecordNewServer。如下图所示。findServerWithSameHostnamePortWithLock主要是查看当前已注册的RegionServer中是否有同名的ServerName,如果有,则返回ServerName,如果没有,则返回null。然后调用recordNewServerWithLock方法,将其ServerName放入成员变量onlineServers中,也就是说,该RegionServer已经实现了HMaster端的注册。接着调用已注册listeners的serverAdded方法,这些listeners都实现了ServerListener。主要有三个实现ServerListener接口的类:AssignmentManager、RSProcedureDispatcher、DrainingServerTracker。其中DrainingServerTracker是在其start方法中构造的匿名类。
至此,HMaster端实现与HRegionServer的第一次通信。接着,HRegionServer开始调用HRegionServe.handleReportForDutyResponse方法。如下图所示。一开始的for循环是为了将HMaster端返回的部分信息添加到当前的conf成员变量中。紧接着createMyEphemeralNode方法将当前RegionServer的节点信息写入ZK中,路径为/hbase/rs/~。然后调用ZNodeClearer.writeMyEphemeralNodeOnDisk将信息本地化。再然后调用了setupWALAndReplication、startReplicationService两个方法。由于setupWALAndReplication方法比较重要,我将在后面贴图详细介绍。
首先,我们来到setupWALAndReplication方法。在setupWALAndReplication方法中,主要做了两件事情,其一是构造WALFactory,另外一个就是调用createNewReplicationInstance。
接下来,让我们来到Replication.initialize方法,如下图所示。方法很长,但重点只是构造了ReplicationSourceManager。而在ReplicationSourceManager的构造方法也只是将入参封装,并构建了一个线程池。
接下来,来到handleReportForDutyResponse中第二个重要也是最重要的方法startServices。这个方法很长,几乎所有的RegionServer的服务都是直接或间接通过这个方法启动的。
首先,我们来看initializeThreads。
来到CompactSplit的构造方法以及他在构造方法中主要调用的两个方法。在他的createCompactionExecutors方法中构造了一个StealJobQueue对象。这个类继承自PriorityBlockingQueue,并且内部有一个BlockingQueue类型的stealFromQueue成员变量。然后构建了两个线程池,分别以StealJobQueue、StealJobQueue.stealFromQueue为线程池的工作队列。
介绍完CompactSplit的实例化后,让我们继续回到HRegionServer.initializeThreads方法中。在方法内,接着构造了CompactionChecker、PeriodicMemStoreFlusher这两个ScheduledChore。接下来构造了Leases(看到这里,你是不是很容易想到HDFS的租约系统LeaseManager)。他扩展了Thread而不是Chore,因为当有事情要做时,睡眠时间可以被中断,而不是Chore睡眠时间是不变的。
到此为止,我们已经介绍完了上面所有贴图。下面,让我们回到HRegionServer.run方法的后半部分。在这里,已经接近结束了。我只是简单介绍一下。
本节到这里就结束了,大家有什么不懂的地方可以私信我的邮箱15935152719@163.com。如果感觉不错,希望留下你的赞。你的肯定是小编继续前进的动力。HBase之HRegionServer启动(含与HMaster交互)的更多相关文章
- 全网最详细的HBase启动以后,HMaster进程启动了,几秒钟以后自动关闭问题的解决办法(图文详解)
不多说,直接上干货! 问题详情 情况描述如题所示,hbase启动以后,HMaster进程启动了,几秒钟以后自动关闭,但是HRegionServer进程正常运行: 解决办法: 1.检查下每台机器的时间是 ...
- Hbase HRegionServer启动后自动关闭
突然发现HBASE无法使用了. 然后看到在分布式的情况下,节点上的HRegionServer启动后自动关闭. 同步时间就能解决这个问题. 网上同步时间 1. 安装ntpdate工具 sudo apt ...
- hbase集群部分节点HRegionServer启动后自动关闭的问题
参考链接 http://f.dataguru.cn/thread-209058-1-1.html 我有4HRegionServer节点,1个master,其中3个是unbuntu 系统,2个节点是ce ...
- 重启集群的时候发现HBase的HRegionServer 服务启动失败
今天在测试环境下的集群重启了下,启动Hbase的时候报错: $ sh start-hbase.sh starting master, logging to /home/hadoop/hbase-0.9 ...
- HBase安装和启动
目录 认识HBase 前期准备 1. 解压HBase 2. 修改3个配置文件(配置文件目录:hbase-0.96.2-hadoop2/conf/) 3. 将hadoop的hdfs-site.xml和c ...
- 【原创】大叔问题定位分享(24)hbase standalone方式启动报错
hbase 2.0.2 hbase standalone方式启动报错: 2019-01-17 15:49:08,730 ERROR [Thread-24] master.HMaster: Failed ...
- HBase——HMaster启动之二(HMaster线程的调用)
紧接着上一节HMaster的构建完成.接下来会调用HMaster调用master.start(),master.join(). 由HMaster的继承关系,很明显,他是Runnable的子类.也就是说 ...
- HBase启动后发现HMaster进程消失了
HMaster没起来很多原因,这次看日志是这个.详细请看:http://www.bkjia.com/yjs/982064.html Hbase:namespace异常处理,hbase异常处理 Hbas ...
- 大数据 时间同步问题 解决hbase集群节点HRegionServer启动后自动关闭
1)在hbase-site.xml文件中 修改增加 ,将时间改大点<property><name>hbase.master.maxclockskew</name>& ...
随机推荐
- grunt压缩js代码
安装node.js的环境和grunt插件在上一篇已经将过,点击这里跳到上一篇 所以我们直接从压缩插件的安装开始讲 起 1.安装uglify插件 目录结构如下: 命令行:npm install grun ...
- iOS12 XCode10更新
原因:libc++.tbd库取代了libstdc++.6.0.9.tbd库 解决方法:我在项目里去掉了libstdc++.6.0.9.tbd库 这个时候去编译还是会报错, 解决方法:Xcode-fil ...
- vue版 文件下载
标签的download: 是HTML5标准新增的属性,作用是指示浏览器下载URL而不是导航到URL,因此将提示用户将其保存为本地文件. 这种是定义的接口不是下载文件的路径,而是通过API可以获得文件的 ...
- C++标准库之右值引用相关:引用折叠
引用折叠 引用折叠出现的情况在于范型编程时. void f(T&& param); f(10); int x = 10; f(x); 这两者都可运行成功. 由于存在T&& ...
- 计算机爱好者协会技术贴markdown第三期
之前都是给大家展示的对文本的基本操作,这一期我们要给大家展示的就是很高大上的东西了哦 看左边是不是超low,右边是不是瞬间高大上了!!! 一个简单的表格是这么创建的: 爱酱 | Value - ...
- Concept Drift(概念漂移)
Introdution concept drift在机器学习.时间序列以及模式识别领域的一种现象.如果是在机器学习领域中,这个概念指的就是一个模型要去预测的一个目标变量,概念漂移就是这个目标变量随着时 ...
- c刷题
1.转义字符: C中定义了一些字母前加 "\" 来表示常见的那些不能显示的ASCII字符,如\0 空字符,\r 回车, \n换行等,就称为转义字符,因为后面的字符,都不是它本来的A ...
- kubernetes1.7.6 ha高可用部署
写在前面: 1. 该文章部署方式为二进制部署. 2. 版本信息 k8s 1.7.6,etcd 3.2.9 3. 高可用部分 etcd做高可用集群.kube-apiserver 为无状态服务使用hap ...
- TopicsExtraction with NMF & LDA
""" ================================================================================= ...
- 基于UML的高校教务管理系统的设计与实现
一.基本信息 标题:基于UML的高校教务管理系统的设计与实现 时间:2018 出版源:南昌航空大学 领域分类:教育信息化:教务管理系统:UML:SSH:Oracle 二.研究背景 问题定义:高校教务管 ...