这次来解析一下HBase1.0.0中,RegionServer的启动过程。
一:启动shell脚本
首先从启动RegionServer的shell命令开始看起吧,通常都是通过hbase-daemon.sh start regionserver命令来启动RegionServer的。在windows下用notepad++打开对应的shell脚本,可以看到start参数对应如下脚本:

相当于就是再次调用hbase-daemon.sh internal_start,对应的shell脚本片段如下:

定位到最后的hbase命令对应的shell脚本可以看到如下代码:


找了这么久,总算是定位到RegionServer就是在运行org.apache.hadoop.hbase.regionserver.HRegionServer这个java类了。
二:HRegionServer的启动
打开eclipse,用maven导入源代码,直接翻到main函数,代码如下

这里HRegionServerCommandLine的doMain方法以后讲hmaster的时候在细讲,主要作用就是接受命令行传来的参数,构造一个HRegionServer实例,然后在开启对应线程执行HRegionServer的线程主体。
其中HRegionServer的函数定义为:

conf对应着配置文件,csm是一个协调服务,提供启停Server等方法,由HRegionServerCommandLine根据配置文件确定具体的实现类。
HRegionServer的构造函数实在过于冗长,下面只是讲讲大概做了什么,具体的代码就不贴上来了:
1.根据配置文件初始化regionserver的userProvider对象,用于权限认证;
2.根据配置文件初始化regionserver的nonceManager对象,用于防止类似于网页开发中的重复提交,可以参考这篇文章(http://blog.csdn.net/lipeng_bigdata/article/details/50464441),默认情况下是开启的;
3.根绝配置文件,创建RegionServer的RPC服务端;
4.根据系统时间,生成serverName(这里贴一下代码,因为web管理页面的服务器名称就是根据这个弄来的,代码很简单,就不细讲了)

5.启动RPC服务,这里的RPC与hadoop RPC类似,有listener responser scheduler 也有相关队列;
6.启动动态的RegionServer配置服务,在1.0的版本中,部分参数的修改不需要通过重启生效;
7.初始化在zookeeper上面的信息;
8.构造walRoller对象,这个等下详细讲。
三:关于walRoller
HRegionServer与walRoller的类图大概如下面所示:

这里其实最想表达的疑惑为什么不干脆把LogRoller的构造函数,弄成形如LogRoller(hrs:HRegionServer)的样子。虽然面向对象的思想告诉我们,软件设计应该遵循抽象与多态的原则,巧妙地运用接口,但是按照这种思想这里调用的时候却传入了两个一模一样的参数,个人感觉还是不太对,也许以后能够了解吧。
四:RegionServer的运行
在run方法中,首先初始化zookeeper,然后开启检测线程,检测RegionServer是不是挂了;接着,为coprocessor配置运行环境(考虑到coprocessor可能会需要zk,所以先初始化zookeeper);然后就开始向master注册自己;最后的线程主体中,只要集群还监控运行就会汇报自己的信息,直到集群停止,再根据配置回收一系列资源。
网友评论