分享

Region Server启动和构造

本帖最后由 pig2 于 2014-3-30 14:03 编辑
1 启动
         代码起始位置:HRegionServer3730行。
启动RegionServer的主类是HRegionServer。
main函数中主要是设置config。doMain中将-D中的配置设置到config中。因此配置的优先级为,-D>hbase配置>hadoop配置。
之后判断命令内容,值得注意的是是不允许通过stop关闭RegionServer,需要通过bin/hbase-daemon.sh stop regionserver和Kill关闭。另外一个合法的命令就是start了。start中如果为LOCAL模式的话则不允许启动。HRegionServer的实例是通过反射构造出来的,类型可以配置到配置文件中。由于HRegionServer本身为Runable所以直接将生成的对象放到Thead中启动即可。启动的最后,替换了进程关闭钩子(原有钩子只在程序顺利启动前起效,会删除一些ZK连接、ZK路径和HDFS文件)。
启动流程到此就为止了
2 HRegionServer构造函数
         代码起始位置:HRegionServer 397行。
上篇说道HRegionServer是通过反射调用构造函数,这回我们来分析一下HRegionServer构造函数都做了什么。
首先通过配置构造machineName(ip或域名),如果"hbase.regionserver.dns.interface"值为"default",则使用hadoop中的自解析域名。如果"hbase.regionserver.dns.nameserver"为"default"则把他设成null再递归地调用一次获取machineName(意义何在啊……)。如果两者都不为"default"则根据"hbase.regionserver.dns.interface"配置的网卡名获取ip。machineName获取完成后拼接配置的端口号,生成HServerAddress对象(里面要将拼接好的字符串再解开,意义何在啊……),这里会将ip再次解析成域名。
然后设置一些变量的初始值:通过this.abortRequested= false;    this.fsOk = true;猜测,文件系统不可访问时的逻辑和文件系统正常的逻辑有可能搅在了一起;根据config对象的哈希值(^config中每个Entry的哈希值)生成ServerConnection对象(实现为org.apache.hadoop.hbase.client.HConnectionManager.TableServers,它的注释为 Encapsulates finding the servers for an HBase instance ,与处理客户端请求相关);从配置中读取重试次数、responseSizeLimit等值;生成定长sleep类Sleeper的实例;生成执行master命令的Worker类实例;生成Region开启关闭处理线程池实例;生成我猜是用来处理请求的线程池PreloadThreadPool类的实例。
在众多设置变量初始值的语句中,有一行reinitialize();想必这既是重中之重了。函数中先是设置了一些变量的值,这些值的生存周期(与服务共生死)应当与构造函数中的(与进程共生死)不同:构造RPC响应服务实例server用并获得临时端口号;初始化服务状态类HServerInfo对象;重命名线程名;初始化zookeeper客户端和监听;初始化workerThread(为上述Worker类实例创建线程);初始化flush memstore线程MemStoreFlusher类实例;初始化compact与split响应类CompactSplitThread(并非一个线程)实例;向配置更新监听类ConfigurationObserver对象注册通知compactSplitThread等对象;根据配置创建多个hlog滚动线程LogRoller类实例;初始化MajorCompactionChecker类实例(封装的线程);this.leases = new Leases,似乎与请求的超时处理有关。
此处有一个对象的初始化比较有意思reservedSpace,从代码引用上和注释上看,只有在退出时会被释放。其他时间并不会用到这个变量。猜测其设计目的是为了给OOM Exception出现时预留内存,从而使进程能够有足够的内存保证正常退出。正常退出对于保存关键信息的服务或存储服务来说十分重要,非正常退出极易丢失数据。
    通过这次的分析,大致能够了解HRegionServer提供服务所依赖的线程了。
---------------------------------------------------------华丽的分割线---------------------------------------------------------------------
编码不是一朝一夕的事儿,并且多人长期合作必然会导致部分没有意义的代码。更多理论知识,可参考《人月神话》。

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条