您的位置:首页 > 编程语言

hbase 源代码分析 (9) hbase启动过程

2017-07-14 21:50 836 查看
上一章节:hbase源代码分析(8)delete过程详解http://blog.csdn.net/chenfenggang/article/details/75094362这一章节主要分析shell脚本。hbase的启动过程。过程如下:1)运行start-hbase.sh2)加载conf,加载需要lib,class文件,包括jdk里面的,hbase本身的。3)判断安装模式4)如果集群模式需要启动a)zookeeper,b)Masterc)RegionServiced)master-backup如果本地模式则只需要启动master就够了。在master里面会new一个zk,和启动一个regionService,但是这个master和regionSerivce是同一个JVM启动maseter主要是调用org.apache.hadoop.hbase.master.HMaster而启动regionSeriver主要是启动org.apache.hadoop.hbase.regionserver.HRegionServer里的main函数zk对应org.apache.hadoop.hbase.zookeeper.HQuorumPeer主要结论:HLog文件查看可以通过WALPrettyPrinterHFIle可以通过类HFilePrettyPrinter查看下面开始分析,第一个脚本start-hbase.sh
usage="Usage:start-hbase.sh[--autostart-window-size<windowsizeinhours>]\
[--autostart-window-retry-limit<retrycountlimitforautostart>]\
[autostart|start]"
#获取当前目录名
bin=`dirname"${BASH_SOURCE-$0}"`
bin=`cd"$bin">/dev/null;pwd`
#defaultautostartargsvalueindicatinginfinitewindowsizeandnoretrylimit
AUTOSTART_WINDOW_SIZE=0
AUTOSTART_WINDOW_RETRY_LIMIT=0
#加载配置
."$bin"/hbase-config.sh
#starthbasedaemons
errCode=$?
if[$errCode-ne0]
then
exit$errCode
fi
if["$1"="autostart"]
then
commandToRun="--autostart-window-size${AUTOSTART_WINDOW_SIZE}--autostart-window-retry-limit${AUTOSTART_WINDOW_RETRY_LIMIT}autostart"
else
commandToRun="start"
fi
#判断模式
#HBASE-6504-onlytakethefirstlineoftheoutputincaseverbosegcison
distMode=`$bin/hbase--config"$HBASE_CONF_DIR"org.apache.hadoop.hbase.util.HBaseConfToolhbase.cluster.distributed|head-n1`
//启动
if["$distMode"=='false']
then
"$bin"/hbase-daemon.sh--config"${HBASE_CONF_DIR}"$commandToRunmaster
else
"$bin"/hbase-daemons.sh--config"${HBASE_CONF_DIR}"$commandToRunzookeeper
"$bin"/hbase-daemon.sh--config"${HBASE_CONF_DIR}"$commandToRunmaster
"$bin"/hbase-daemons.sh--config"${HBASE_CONF_DIR}"\
--hosts"${HBASE_REGIONSERVERS}"$commandToRunregionserver
"$bin"/hbase-daemons.sh--config"${HBASE_CONF_DIR}"\
--hosts"${HBASE_BACKUP_MASTERS}"$commandToRunmaster-backup
fi
配置类hbase-config.sh,这个就是指明bin,conf,home,javahome,master等文件。
....
#Allowalternatehbaseconfdirlocation.
HBASE_CONF_DIR="${HBASE_CONF_DIR:-$HBASE_HOME/conf}"
#Listofhbaseregionsservers.
HBASE_REGIONSERVERS="${HBASE_REGIONSERVERS:-$HBASE_CONF_DIR/regionservers}"
#Listofhbasesecondarymasters.
HBASE_BACKUP_MASTERS="${HBASE_BACKUP_MASTERS:-$HBASE_CONF_DIR/backup-masters}"
if[-n"$HBASE_JMX_BASE"]&&[-z"$HBASE_JMX_OPTS"];then
HBASE_JMX_OPTS="$HBASE_JMX_BASE"
fi
#ThriftJMXopts
if[-n"$HBASE_JMX_OPTS"]&&[-z"$HBASE_THRIFT_JMX_OPTS"];then
HBASE_THRIFT_JMX_OPTS="$HBASE_JMX_OPTS-Dcom.sun.management.jmxremote.port=10103"
fi
#Thriftopts
if[-z"$HBASE_THRIFT_OPTS"];then
exportHBASE_THRIFT_OPTS="$HBASE_THRIFT_JMX_OPTS"
fi
#RESTJMXopts
if[-n"$HBASE_JMX_OPTS"]&&[-z"$HBASE_REST_JMX_OPTS"];then
HBASE_REST_JMX_OPTS="$HBASE_JMX_OPTS-Dcom.sun.management.jmxremote.port=10105"
fi
#RESTopts
if[-z"$HBASE_REST_OPTS"];then
exportHBASE_REST_OPTS="$HBASE_REST_JMX_OPTS"
fi
#Sourcethehbase-env.sh.WillhaveJAVA_HOMEdefined.
#HBASE-7817-Sourcethehbase-env.shonlyifithasnotalreadybeendone.HBASE_ENV_INITkeepstrackofit.
if[-z"$HBASE_ENV_INIT"]&&[-f"${HBASE_CONF_DIR}/hbase-env.sh"];then
."${HBASE_CONF_DIR}/hbase-env.sh"
exportHBASE_ENV_INIT="true"
fi
#Verifyifhbasehasthemlockagent
if["$HBASE_REGIONSERVER_MLOCK"="true"];then
MLOCK_AGENT="$HBASE_HOME/lib/native/libmlockall_agent.so"
if[!-f"$MLOCK_AGENT"];then
cat1>&2<<EOF
Unabletofindmlockall_agent,hbasemustbecompiledwith-Pnative
EOF
exit1
fi
if[-z"$HBASE_REGIONSERVER_UID"]||["$HBASE_REGIONSERVER_UID"=="$USER"];then
HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS-agentpath:$MLOCK_AGENT"
else
HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS-agentpath:$MLOCK_AGENT=user=$HBASE_REGIONSERVER_UID"
fi
fi
exportMALLOC_ARENA_MAX=${MALLOC_ARENA_MAX:-4}
#NowhavingJAVA_HOMEdefinedisrequired
if[-z"$JAVA_HOME"];then
cat1>&2<<EOF
EOF
exit1
fi
最后一个。hbase主要根据参数启动不同的java对象。
bin=`dirname"$0"`
bin=`cd"$bin">/dev/null;pwd`
#ThiswillsetHBASE_HOME,etc.
."$bin"/hbase-config.sh
#判断cygwin
cygwin=false
case"`uname`"in
CYGWIN*)cygwin=true;;
esac
#是否是开发环境
#Detectifweareinhbasesourcesdir
in_dev_env=false
if[-d"${HBASE_HOME}/target"];then
in_dev_env=true
fi
#省去参数判断
#获取命令
#getarguments
COMMAND=$1
shift
JAVA=$JAVA_HOME/bin/java
#去除加载文件
#加载jruby文件#checkifthecommmandneedsjruby
declare-ajruby_cmds=("shell""org.jruby.Main")
forcmdin"${jruby_cmds[@]}";do
if[[$cmd=="$COMMAND"]];then
jruby_needed=true
break
fi
done
#thecommandneedsjrub
计算命令执行那些东西
#figureoutwhichclasstorun
if["$COMMAND"="shell"];then
	#findthehbaserubysources
if[-d"$HBASE_HOME/lib/ruby"];then
HBASE_OPTS="$HBASE_OPTS-Dhbase.ruby.sources=$HBASE_HOME/lib/ruby"
else
HBASE_OPTS="$HBASE_OPTS-Dhbase.ruby.sources=$HBASE_HOME/hbase-shell/src/main/ruby"
fi
HBASE_OPTS="$HBASE_OPTS$HBASE_SHELL_OPTS"
CLASS="org.jruby.Main-X+O${JRUBY_OPTS}${HBASE_HOME}/bin/hirb.rb"
elif["$COMMAND"="hbck"];then
CLASS='org.apache.hadoop.hbase.util.HBaseFsck'
#TODOremoveold'hlog'version
elif["$COMMAND"="hlog"-o"$COMMAND"="wal"];then
CLASS='org.apache.hadoop.hbase.wal.WALPrettyPrinter'
elif["$COMMAND"="hfile"];then
CLASS='org.apache.hadoop.hbase.io.hfile.HFilePrettyPrinter'
elif["$COMMAND"="zkcli"];then
CLASS="org.apache.hadoop.hbase.zookeeper.ZooKeeperMainServer"
elif["$COMMAND"="backup"];then
CLASS='org.apache.hadoop.hbase.backup.BackupDriver'
elif["$COMMAND"="restore"];then
CLASS='org.apache.hadoop.hbase.backup.RestoreDriver'
elif["$COMMAND"="upgrade"];then
echo"ThiscommandwasusedtoupgradetoHBase0.96,itwasremovedinHBase2.0.0."
echo"Pleasefollowthedocumentationat'target='_blank'>http://hbase.apache.org/book.html#upgrading."[/code]
exit1
elif["$COMMAND"="snapshot"];then
SUBCOMMAND=$1
shift
if["$SUBCOMMAND"="create"];then
CLASS="org.apache.hadoop.hbase.snapshot.CreateSnapshot"
elif["$SUBCOMMAND"="info"];then
CLASS="org.apache.hadoop.hbase.snapshot.SnapshotInfo"
elif["$SUBCOMMAND"="export"];then
CLASS="org.apache.hadoop.hbase.snapshot.ExportSnapshot"
else
echo"Usage:hbase[<options>]snapshot<subcommand>[<args>]"
echo"$options_string"
echo""
echo"Subcommands:"
echo"createCreateanewsnapshotofatable"
echo"infoToolfordumpingsnapshotinformation"
echo"exportExportanexistingsnapshot"
exit1
fi
elif["$COMMAND"="master"];then
CLASS='org.apache.hadoop.hbase.master.HMaster'
if["$1"!="stop"]&&["$1"!="clear"];then
HBASE_OPTS="$HBASE_OPTS$HBASE_MASTER_OPTS"
fi
elif["$COMMAND"="regionserver"];then
CLASS='org.apache.hadoop.hbase.regionserver.HRegionServer'
if["$1"!="stop"];then
HBASE_OPTS="$HBASE_OPTS$HBASE_REGIONSERVER_OPTS"
fi
elif["$COMMAND"="thrift"];then
CLASS='org.apache.hadoop.hbase.thrift.ThriftServer'
if["$1"!="stop"];then
HBASE_OPTS="$HBASE_OPTS$HBASE_THRIFT_OPTS"
fi
elif["$COMMAND"="thrift2"];then
CLASS='org.apache.hadoop.hbase.thrift2.ThriftServer'
if["$1"!="stop"];then
HBASE_OPTS="$HBASE_OPTS$HBASE_THRIFT_OPTS"
fi
elif["$COMMAND"="rest"];then
CLASS='org.apache.hadoop.hbase.rest.RESTServer'
if["$1"!="stop"];then
HBASE_OPTS="$HBASE_OPTS$HBASE_REST_OPTS"
fi
elif["$COMMAND"="zookeeper"];then
CLASS='org.apache.hadoop.hbase.zookeeper.HQuorumPeer'
if["$1"!="stop"];then
HBASE_OPTS="$HBASE_OPTS$HBASE_ZOOKEEPER_OPTS"
fi
elif["$COMMAND"="clean"];then
case$1in
--cleanZk|--cleanHdfs|--cleanAll)
matches="yes";;
*);;
esac
if[$#-ne1-o"$matches"=""];then
echo"Usage:hbaseclean(--cleanZk|--cleanHdfs|--cleanAll)"
echo"Options:"
echo"--cleanZkcleanshbaserelateddatafromzookeeper."
echo"--cleanHdfscleanshbaserelateddatafromhdfs."
echo"--cleanAllcleanshbaserelateddatafrombothzookeeperandhdfs."
exit1;
fi
"$bin"/hbase-cleanup.sh--config${HBASE_CONF_DIR}$@
exit$?
elif["$COMMAND"="mapredcp"];then
CLASS='org.apache.hadoop.hbase.util.MapreduceDependencyClasspathTool'
elif["$COMMAND"="classpath"];then
echo$CLASSPATH
exit0
elif["$COMMAND"="pe"];then
CLASS='org.apache.hadoop.hbase.PerformanceEvaluation'
HBASE_OPTS="$HBASE_OPTS$HBASE_PE_OPTS"
elif["$COMMAND"="ltt"];then
CLASS='org.apache.hadoop.hbase.util.LoadTestTool'
HBASE_OPTS="$HBASE_OPTS$HBASE_LTT_OPTS"
elif["$COMMAND"="canary"];then
CLASS='org.apache.hadoop.hbase.tool.Canary'
HBASE_OPTS="$HBASE_OPTS$HBASE_CANARY_OPTS"
elif["$COMMAND"="version"];then
CLASS='org.apache.hadoop.hbase.util.VersionInfo'
else
CLASS=$COMMAND
fi
#HaveJVMdumpheapifwerunoutofmemory.Fileswillbe'launchdirectory'
#andarenamedlikethefollowing:java_pid21612.hprof.Apparentlyitdoesn't
#'cost'tohavethisflagenabled.Itsa1.6flagonly.See:
#'target='_blank'>http://blogs.sun.com/alanb/entry/outofmemoryerror_looks_a_bit_better[/code]
HBASE_OPTS="$HBASE_OPTS-Dhbase.log.dir=$HBASE_LOG_DIR"
HBASE_OPTS="$HBASE_OPTS-Dhbase.log.file=$HBASE_LOGFILE"
HBASE_OPTS="$HBASE_OPTS-Dhbase.home.dir=$HBASE_HOME"
HBASE_OPTS="$HBASE_OPTS-Dhbase.id.str=$HBASE_IDENT_STRING"
HBASE_OPTS="$HBASE_OPTS-Dhbase.root.logger=${HBASE_ROOT_LOGGER:-INFO,console}"
if["x$JAVA_LIBRARY_PATH"!="x"];then
HBASE_OPTS="$HBASE_OPTS-Djava.library.path=$JAVA_LIBRARY_PATH"
exportLD_LIBRARY_PATH="$LD_LIBRARY_PATH:$JAVA_LIBRARY_PATH"
fi
#Enablesecurityloggingonthemasterandregionserveronly
if["$COMMAND"="master"]||["$COMMAND"="regionserver"];then
HBASE_OPTS="$HBASE_OPTS-Dhbase.security.logger=${HBASE_SECURITY_LOGGER:-INFO,RFAS}"
else
HBASE_OPTS="$HBASE_OPTS-Dhbase.security.logger=${HBASE_SECURITY_LOGGER:-INFO,NullAppender}"
fi
HEAP_SETTINGS="$JAVA_HEAP_MAX$JAVA_OFFHEAP_MAX"
#ExecunlessHBASE_NOEXECisset.
exportCLASSPATH
if["${HBASE_NOEXEC}"!=""];then
"$JAVA"-Dproc_$COMMAND-XX:OnOutOfMemoryError="kill-9%p"$HEAP_SETTINGS$HBASE_OPTS$CLASS"$@"
else
exec"$JAVA"-Dproc_$COMMAND-XX:OnOutOfMemoryError="kill-9%p"$HEAP_SETTINGS$HBASE_OPTS$CLASS"$@"
fi
最后执行Java类COMMAND:start/stop/restartOnOutOfMemoryError:当内存溢出时直接杀死进程HEAP_SETTINGS:设置最大堆,CLASS:这个就是org.apache.hadoop.hbase.regionserver.HRegionServer等。
最后执行Java类COMMAND:start/stop/restartOnOutOfMemoryError:当内存溢出时直接杀死进程HEAP_SETTINGS:设置最大堆,CLASS:这个就是org.apache.hadoop.hbase.regionserver.HRegionServer等。从上面可以看出,通过HFilePrettyPrinter可以参考hfile内容是什么。WALPrettyPrinter可以打开HLOG文件,可以而且hbaseshell是启动的ruby文件。HMaster的启动入口
publicstaticvoidmain(String[]args){VersionInfo.logVersion();newHMasterCommandLine(HMaster.class).doMain(args);}
HRegionSerive的启动入口
/***@seeorg.apache.hadoop.hbase.regionserver.HRegionServerCommandLine*/publicstaticvoidmain(String[]args)throwsException{VersionInfo.logVersion();Configurationconf=HBaseConfiguration.create();@SuppressWarnings("unchecked")Class<?extendsHRegionServer>regionServerClass=(Class<?extendsHRegionServer>)conf.getClass(HConstants.REGION_SERVER_IMPL,HRegionServer.class);newHRegionServerCommandLine(regionServerClass).doMain(args);}
后面将继续将HMaster和HRegionService启动过程未完待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  源代码 hbase