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] exit1elif["$COMMAND"="snapshot"];thenSUBCOMMAND=$1shiftif["$SUBCOMMAND"="create"];thenCLASS="org.apache.hadoop.hbase.snapshot.CreateSnapshot"elif["$SUBCOMMAND"="info"];thenCLASS="org.apache.hadoop.hbase.snapshot.SnapshotInfo"elif["$SUBCOMMAND"="export"];thenCLASS="org.apache.hadoop.hbase.snapshot.ExportSnapshot"elseecho"Usage:hbase[<options>]snapshot<subcommand>[<args>]"echo"$options_string"echo""echo"Subcommands:"echo"createCreateanewsnapshotofatable"echo"infoToolfordumpingsnapshotinformation"echo"exportExportanexistingsnapshot"exit1fielif["$COMMAND"="master"];thenCLASS='org.apache.hadoop.hbase.master.HMaster'if["$1"!="stop"]&&["$1"!="clear"];thenHBASE_OPTS="$HBASE_OPTS$HBASE_MASTER_OPTS"fielif["$COMMAND"="regionserver"];thenCLASS='org.apache.hadoop.hbase.regionserver.HRegionServer'if["$1"!="stop"];thenHBASE_OPTS="$HBASE_OPTS$HBASE_REGIONSERVER_OPTS"fielif["$COMMAND"="thrift"];thenCLASS='org.apache.hadoop.hbase.thrift.ThriftServer'if["$1"!="stop"];thenHBASE_OPTS="$HBASE_OPTS$HBASE_THRIFT_OPTS"fielif["$COMMAND"="thrift2"];thenCLASS='org.apache.hadoop.hbase.thrift2.ThriftServer'if["$1"!="stop"];thenHBASE_OPTS="$HBASE_OPTS$HBASE_THRIFT_OPTS"fielif["$COMMAND"="rest"];thenCLASS='org.apache.hadoop.hbase.rest.RESTServer'if["$1"!="stop"];thenHBASE_OPTS="$HBASE_OPTS$HBASE_REST_OPTS"fielif["$COMMAND"="zookeeper"];thenCLASS='org.apache.hadoop.hbase.zookeeper.HQuorumPeer'if["$1"!="stop"];thenHBASE_OPTS="$HBASE_OPTS$HBASE_ZOOKEEPER_OPTS"fielif["$COMMAND"="clean"];thencase$1in--cleanZk|--cleanHdfs|--cleanAll)matches="yes";;*);;esacif[$#-ne1-o"$matches"=""];thenecho"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"];thenCLASS='org.apache.hadoop.hbase.util.MapreduceDependencyClasspathTool'elif["$COMMAND"="classpath"];thenecho$CLASSPATHexit0elif["$COMMAND"="pe"];thenCLASS='org.apache.hadoop.hbase.PerformanceEvaluation'HBASE_OPTS="$HBASE_OPTS$HBASE_PE_OPTS"elif["$COMMAND"="ltt"];thenCLASS='org.apache.hadoop.hbase.util.LoadTestTool'HBASE_OPTS="$HBASE_OPTS$HBASE_LTT_OPTS"elif["$COMMAND"="canary"];thenCLASS='org.apache.hadoop.hbase.tool.Canary'HBASE_OPTS="$HBASE_OPTS$HBASE_CANARY_OPTS"elif["$COMMAND"="version"];thenCLASS='org.apache.hadoop.hbase.util.VersionInfo'elseCLASS=$COMMANDfi#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"];thenHBASE_OPTS="$HBASE_OPTS-Djava.library.path=$JAVA_LIBRARY_PATH"exportLD_LIBRARY_PATH="$LD_LIBRARY_PATH:$JAVA_LIBRARY_PATH"fi#Enablesecurityloggingonthemasterandregionserveronlyif["$COMMAND"="master"]||["$COMMAND"="regionserver"];thenHBASE_OPTS="$HBASE_OPTS-Dhbase.security.logger=${HBASE_SECURITY_LOGGER:-INFO,RFAS}"elseHBASE_OPTS="$HBASE_OPTS-Dhbase.security.logger=${HBASE_SECURITY_LOGGER:-INFO,NullAppender}"fiHEAP_SETTINGS="$JAVA_HEAP_MAX$JAVA_OFFHEAP_MAX"#ExecunlessHBASE_NOEXECisset.exportCLASSPATHif["${HBASE_NOEXEC}"!=""];then"$JAVA"-Dproc_$COMMAND-XX:OnOutOfMemoryError="kill-9%p"$HEAP_SETTINGS$HBASE_OPTS$CLASS"$@"elseexec"$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 0.99 源代码分析 - Master启动过程(1)
- hbase 源代码分析 (12) Master和RegionService 启动过程
- hbase 源代码分析 (19) HMaster 启动负载均衡过程分析
- HBase 0.99 源代码分析 - Master启动过程(2)
- Android系统进程Zygote启动过程的源代码分析(老罗的作品)
- Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序启动过程源代码分析
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析(4)
- Android系统进程Zygote启动过程的源代码分析
- Android源码解析之应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序组件Content Provider的启动过程源代码分析
- Android应用程序启动过程源代码分析
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
- hbase 源代码分析 (15)compact 过程
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析(2)
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
- Activity启动过程源代码分析
- [转载] Android应用程序内部启动Activity过程(startActivity)的源代码分析
- Android应用程序启动过程源代码分析(2)