zoukankan      html  css  js  c++  java
  • HBase配置&启动脚本分析

    本文档基于hbase-0.96.1.1-cdh5.0.2,对HBase配置&启动脚本进行分析
    date:2016/8/4
    author:wangxl

    HBase配置&启动脚本分析

    剔除window相关脚本,我们主要分析配置文件与.sh文件

    1 文件概览

    conf
    ├── hadoop-metrics2-hbase.properties
    ├── hbase-env.sh
    ├── hbase-policy.xml
    ├── hbase-site.xml
    ├── log4j.properties
    └── regionservers
    bin
    ├── graceful_stop.sh
    ├── hbase
    ├── hbase-cleanup.sh
    ├── hbase-common.sh
    ├── hbase-config.sh
    ├── hbase-daemon.sh
    ├── hbase-daemons.sh
    ├── local-master-backup.sh
    ├── local-regionservers.sh
    ├── master-backup.sh
    ├── regionservers.sh
    ├── rolling-restart.sh
    ├── start-hbase.sh
    ├── stop-hbase.sh
    └── zookeepers.sh
    

    2 分析

    我们依据集群的构建步骤,先分析集群服务脚本,从中穿插配置文件,最后分析自带shell执行流程。

    2.1 服务启动脚本分析

    #start-hbase.sh
    1.执行"$bin"/hbase-config.sh [--->hbase-config.sh]
    2.如果带参为autorestart,则commandToRun="autorestart",否则commandToRun="start"
    3.设置distMode=HBASE_ENV_INIT,也就是hbase-config.sh中设置的HBASE_ENV_INIT[只要HBASE_ENV_INIT无值且${HBASE_CONF_DIR}/hbase-env.sh存在就为true]
    	$distMode为false,则hbase-daemon.sh $commandToRun master $@
    	$distMode为true,则
    		  "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" $commandToRun zookeeper
    		  "$bin"/hbase-daemon.sh --config "${HBASE_CONF_DIR}" $commandToRun master 
    		  "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" 
    		    --hosts "${HBASE_REGIONSERVERS}" $commandToRun regionserver
    		  "$bin"/hbase-daemons.sh --config "${HBASE_CONF_DIR}" 
    		    --hosts "${HBASE_BACKUP_MASTERS}" $commandToRun master-backup
    4.转向hbase-daemons.sh [--->hbase-daemons.sh]
    

    #hbase-config.sh
    1.设置HBASE_HOME为本脚本所在目录
    2.判断参数个数,可以设置--config或--hosts[注:一般无]
    3.HBASE_CONF_DIR设置为$HBASE_CONF_DIR或$HBASE_HOME/conf[优先前者]
    4.HBASE_REGIONSERVERS为$HBASE_REGIONSERVERS或$HBASE_CONF_DIR/regionservers
    5.HBASE_BACKUP_MASTERS为$HBASE_BACKUP_MASTERS或$HBASE_CONF_DIR/backup-masters
    6.设置Thrift JMX参数,条件是:
    	HBASE_JMX_OPTS字符长度非0 && HBASE_THRIFT_JMX_OPTS无值
    	成立则:HBASE_THRIFT_JMX_OPTS="$HBASE_JMX_OPTS -Dcom.sun.management.jmxremote.port=10103"
    	HBASE_THRIFT_JMX_OPTS有值,则设置并导出HBASE_THRIFT_OPTS=$HBASE_THRIFT_JMX_OPTS
    7.设置REST JMX参数,条件是:
    	HBASE_JMX_OPTS字符长度非0 && HBASE_REST_JMX_OPTS无值
    	成立则:HBASE_REST_JMX_OPTS="$HBASE_JMX_OPTS -Dcom.sun.management.jmxremote.port=10105"
    	HBASE_REST_JMX_OPTS有值,则设置并导出HBASE_REST_OPTS=$HBASE_REST_JMX_OPTS
    8.HBASE_ENV_INIT无值且${HBASE_CONF_DIR}/hbase-env.sh存在,执行"${HBASE_CONF_DIR}/hbase-env.sh",并export HBASE_ENV_INIT="true" [--->hbase-env.sh]
    9.HBASE_REGIONSERVER_UID无值则HBASE_REGIONSERVER_UID="hbase"
    

    #hbase-env.sh
    设置并导出环境变量
    1.JAVA_HOME
    2.PID/LOG目录
    3.SSH端口
    4.内存参数
    5.JMX
    6.远程Debug
    

    #hbase-daemons.sh
    1.参数不足,打印帮助
    2.执行"$bin"/hbase-config.sh  [--->hbase-config.sh]
    3.remote_cmd=cd hbase-0.96.1.1-cdh5.0.2; hbase-daemon.sh --config conf start master [省略了路径]
    4.args=--hosts regionservers --config conf cd hbase-0.96.1.1-cdh5.0.2; hbase-daemon.sh --config conf start master [省略了路径]
    5.command=master
    6.进入case,判断command,进入exec "$bin/regionservers.sh" $args
    7.转向regionservers.sh [--->regionservers.sh ]
    

    #regionservers.sh
    1.参数不足,打印帮助
    2.执行"$bin"/hbase-config.sh  [--->hbase-config.sh]
    3.设置HOSTLIST
    4.遍历HOSTLIST,SSH到各节点,执行操作hbase-daemon.sh [--->hbase-daemon.sh]
    

    #hbase-daemon.sh
    1.参数不足,打印帮助
    2.执行"$bin"/hbase-config.sh  [--->hbase-config.sh]
    3.执行"$bin"/hbase-common.sh  [--->hbase-common.sh]
    4.获取参数,以
    	startStop=start
    	command=regionserver
    5.日志回滚函数(hbase_rotate_log),清楚zk函数(cleanZNode),启动前检查函数(check_before_start),等待完成函数(wait_until_done),略过
    6.HBASE_LOG_DIR为"",则export HBASE_LOG_DIR="$HBASE_HOME/logs",并创建
    7.HBASE_PID_DIR为"",则HBASE_PID_DIR=/tmp
    8.HBASE_IDENT_STRING为"",则export HBASE_IDENT_STRING="$USER"
    9.设置JAVA
    10.导出HBASE_LOG_PREFIX和HBASE_LOGFILE,用于拼接日志文件名
    11.export HBASE_ROOT_LOGGER=${HBASE_ROOT_LOGGER:-"INFO,RFA"},这里看一看出HBASE_ROOT_LOGGER不设置,
    	HBASE_ROOT_LOGGER默认设置的是INFO,RFA,所以想更改日志为DRFA,得去修改hbase-env.sh中的HBASE_ROOT_LOGGER选项
    12.拼接各种日志文件,如服务,pid,gc日志文件
    13.HBASE_NICENESS为"",则export HBASE_NICENESS=0
    14.进入case,选择start分支:
    	check_before_start
        hbase_rotate_log $logout
        hbase_rotate_log $loggc
        echo starting $command, logging to $logout
        nohup $thiscmd --config "${HBASE_CONF_DIR}" internal_start $command $args < /dev/null > ${logout} 2>&1  &
        sleep 1; head "${logout}"
    	重点分析nohup $thiscmd --config "${HBASE_CONF_DIR}" internal_start $command $args < /dev/null > ${logout} 2>&1  &
    	直译:nohup hbase-daemon.sh --config conf internal_start master 2>&1  &
    15.重复上诉步骤,再次进入case,选择internal_start分支:
        echo "`date` Starting $command on `hostname`" >> $loglog
        echo "`ulimit -a`" >> $loglog 2>&1
        nice -n $HBASE_NICENESS "$HBASE_HOME"/bin/hbase 
            --config "${HBASE_CONF_DIR}" 
            $command "$@" start >> "$logout" 2>&1 &
        echo $! > $pid
        wait
        cleanZNode	
    16.最重要的一句话:nice -n 0 hbase -config conf master start
    17.转向hbase脚本 [--->hbase]
    

    #hbase
    1.执行"$bin"/hbase-config.sh [--->hbase-config.sh]
    2.参数无,打印帮助
    3.COMMAND=$1,即COMMAND=master,判断hbase-env-$COMMAND.sh存在,则执行"$HBASE_HOME/conf/hbase-env-$COMMAND.sh"
    4.JAVA_HEAP_MAX=-Xmx1000m,HBASE_HEAPSIZE不为"",JAVA_HEAP_MAX="-Xmx""$HBASE_HEAPSIZE""m"
    5.CLASSPATH添加$JAVA_HOME/lib/tools.jar
    6.CLASSPATH添加$HBASE_HOME/hbase-jars/hbase*.jar
    7.CLASSPATH添加$HBASE_HOME/lib/*.jar
    8.设置HBASE_LOG_DIR
    9.添加hadoop依赖至CLASSPATH和JAVA_LIBRARY_PATH(hadoop-2.3.0-cdh5.0.2/lib/native)
    10.CLASSPATH添加用户自定义HBASE_CLASSPATH/HBASE_CLASSPATH_PREFIX[我们可以添加自己的jar至此]
    11.COMMAND为("master" "regionserver" "thrift" "thrift2" "rest" "avro" "zookeeper")其中一个即为服务
    	为服务,则HBASE_OPTS="$HBASE_OPTS $SERVER_GC_OPTS"
    	其它,则HBASE_OPTS="$HBASE_OPTS $CLIENT_GC_OPTS"
    12.根据对用COMMAND,设置对应CLASS,如CLASS='org.apache.hadoop.hbase.master.HMaster'
    13.设置HBASE_OPTS,包含-Dhbase.log.dir -Dhbase.log.file -Dhbase.home.dir -Dhbase.id.str -Dhbase.root.logger -Djava.library.path=$JAVA_LIBRARY_PATH"(JAVA_LIBRARY_PATH不为空)
    	注意:-Dhbase.root.logger=${HBASE_ROOT_LOGGER:-INFO,console}",说明-Dhbase.root.logger默认使用的是HBASE_ROOT_LOGGER,而HBASE_ROOT_LOGGER默认都有值的,所以INFO,console基本不可能用
    	export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$JAVA_LIBRARY_PATH"
    	为master和regionserver设置-Dhbase.security.logger
    14.最后export CLASSPATH
    15.执行exec "$JAVA" -Dproc_$COMMAND -XX:OnOutOfMemoryError="kill -9 %p" $JAVA_HEAP_MAX $HBASE_OPTS $CLASS "$@"
    	直译:
    	 java -Dproc_master -XX:OnOutOfMemoryError=kill -9 %p -Xmx1000m -XX:+UseConcMarkSweepGC -Xmx2048m -Xms2048m -Xmn1024m -XX:PermSize=100m -XX:MaxPermSize=100m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8070 -Dhbase.log.dir=/opt/hadoop/hadoop-cluster/logs/hbase -Dhbase.log.file=hbase-hadoop-master-hadoop-dev-214.log -Dhbase.home.dir=/opt/hadoop/hadoop-cluster/modules/hbase-0.96.1.1-cdh5.0.2 -Dhbase.id.str=hadoop -Dhbase.root.logger=INFO,DRFA -Djava.library.path=/opt/hadoop/hadoop-cluster/modules/hadoop-2.3.0-cdh5.0.2/lib/native -Dhbase.security.logger=INFO,RFAS org.apache.hadoop.hbase.master.HMaster
    

    #hbase-common.sh
    内部就一个函数,waitForProcessEnd() ,Shared function to wait for a process end. Take the pid and the command name as parameters
    

    2.2 其它脚本

    1.graceful_stop.sh: move服务器上的所有region后,再stop/restart该服务器,可以用来进行版本的热升级 
    2.rolling-restart.sh:可以用来挨个滚动重启 
    

    3 小结

    启动整个集群(hbase-daemons.sh)
    -->启动节点同服务(hbase-daemons.sh)
    -->ssh分发(regionservers.sh)
    -->单机单服务(hbase-daemon.sh)
    -->构造Java服务(hbase)
    
    其它:环境变量+加载JAR+OPTS+日志
  • 相关阅读:
    python 语法
    python调试
    08 ES6 基本介绍
    微信小程序中 一些封装的函数
    07 豆瓣小程序项目
    06自定义组件 和 网络请求api
    05 常用组件 和 小程序WXS语法
    04小程序逻辑层App() ,Page() 中的生命周期函数 和 页面路由(页面栈 )
    03小程序的WXSS 和 flex 布局
    02小程序的WXML 和 事件
  • 原文地址:https://www.cnblogs.com/riordon/p/5739980.html
Copyright © 2011-2022 走看看