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+日志
  • 相关阅读:
    null in ABAP and nullpointer in Java
    SAP ABAP SM50事务码和Hybris Commerce的线程管理器
    Hybris service layer和SAP CRM WebClient UI架构的横向比较
    SAP ABAP和Linux系统里如何检查网络传输的数据量
    SAP CRM WebClient UI和Hybris的controller是如何被调用的
    SAP CRM和Cloud for Customer订单中的业务伙伴的自动决定机制
    SAP CRM WebClient UI和Hybris CommerceUI tag的渲染逻辑
    SAP BSP和JSP页面里UI元素的ID生成逻辑
    微信jsapi支付
    微信jsapi退款操作
  • 原文地址:https://www.cnblogs.com/riordon/p/5739980.html
Copyright © 2011-2022 走看看