本文基于HBase-0.94.1分析HMaster的启动流程。
1.HMaster命令行启动简述
HMaster的启动流程可以概括为:
将用户所要执行的"hbase-daemon.sh start master" 操作封装成一个HMasterCommandLine对象(一个tool实例),交给org.apache.hadoop.util.ToolRunner的静态方法run(conf,tool,args) 去执行;其中args为"start". 具体流程如下:
通过$HBASE_HOME/bin/hbase-daemon.sh start master 启动master时,会调用$HBASE_HOME/bin/hbase start master
$HBASE_HOME/bin/hbase start master
可以看下$HBASE_HOME/bin/hbase的内容:
"$JAVA" -XX:OnOutOfMemoryError="kill -9 %p" $JAVA_HEAP_MAX $HBASE_OPTS -classpath "$CLASSPATH" $CLASS "$@"
也即执行了如下方法:
org.apache.hadoop.hbase.master.HMaster.main("start")
HMaster的main方法创建了一个HMasterCommandLine对象,执行该对象的doMain(args)方法。
/**
* @see org.apache.hadoop.hbase.master.HMasterCommandLine
*/
public static void main(String [] args) throws Exception {
VersionInfo.logVersion();
new HMasterCommandLine(HMaster.class).doMain(args);
}
ServerCommandLine是HMasterCommandLine的父类,它实现了Tool接口,通过Hadoop中的ToolRunner机制执行启动/停止等各种命令
/**
* Parse and run the given command line. This may exit the JVM if
* a nonzero exit code is returned from <code>run()</code>.
*/
public void doMain(String args[]) throws Exception {
int ret = ToolRunner.run(
HBaseConfiguration.create(), this, args);
if (ret != 0) {
System.exit(ret);
}
}
2.HMaster的启动采用了ToolRunner机制
ToolRunner的run方法如下:
(1). 将conf和args封装成GenericOptionsParser对象parser, 根据parser获取toolArgs
(2). 返回tool.run(toolArgs);
public static int run(Configuration conf, Tool tool, String[] args)
throws Exception{
if(conf == null) {
conf