HBase配置&啓動腳本分析

本文檔基於hbase-0.96.1.1-cdh5.0.2,對HBase配置&啓動腳本進行分析
date:2016/8/4
author:wangxljava

HBase配置&啓動腳本分析

剔除window相關腳本,咱們主要分析配置文件與.sh文件shell

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執行流程。apache

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+日誌
相關文章
相關標籤/搜索