这几天正好在做cdh4.6.0到cdh5.2.0的升级测试,经常需要启动/关闭各种服务,简单看了下各个服务管理脚本,这里简单记录下:

主要的服务管理脚本如下

hdfs相关

1)hadoop-daemon.sh,可用于启动单一的服务

依次调用hadoop-config.sh和hadoop-env.sh 
加载相关的配置和环境变量,比如nn的jvm配置等(hadoop-env.sh)
在这里可以设置

1
export HADOOP_ROOT_LOGGER=DEBUG,console

来控制观察hadoop启动时的debug日志
以start为例,最终通过nohup的方式来启动服务

1
2
3
4
5
6
7
8
9
10
11
12
13
 case $command in
      namenode|secondarynamenode|datanode|journalnode|dfs|dfsadmin|fsck|balancer|zkfc)
        if [ -z "$HADOOP_HDFS_HOME" ]; then
          hdfsScript="$HADOOP_PREFIX"/bin/hdfs
        else
          hdfsScript="$HADOOP_HDFS_HOME"/bin/hdfs
        fi
        nohup nice -n $HADOOP_NICENESS $hdfsScript --config $HADOOP_CONF_DIR $command "$@" "$log" 2>&1 < /dev/null &
      ;;
      
 (*)
        nohup nice -n $HADOOP_NICENESS $hadoopScript --config $HADOOP_CONF_DIR $command "$@" "$log" 2>&1 < /dev/null &
      ;;

比如以rollback的形式启动dn,最终为hdfs --config /home/vipshop/conf datanode -rollback
所以,如果要单独启动服务,可以使用hadoop-daemon.sh start  xxxx这种形式。
hdfs脚本会调用具体的类,比如namenode会调用org.apache.hadoop.hdfs.server.namenode.NameNode类,最终的命令java  xxxx org.apache.hadoop.hdfs.server.namenode.NameNode   xxxx

2)hadoop-daemons.sh,hadoop-daemon.sh的复数类型,可用于启动多个服务器的服务,比如dn,nm

调用slaves.sh和

1
hadoop-daemon.sh --config /home/vipshop/conf --script hdfs start namenode

等命令

3)refresh-namenodes.sh    

#refreshes all namenodes(hdfs dfsadmin -fs hdfs://xxxx -refreshNodes)

4)slaves.sh 解析slaves文件,并循环ssh调用命令,比如循环start datanode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if "$HADOOP_SLAVE_NAMES" != '' ] ; then
  SLAVE_NAMES=$HADOOP_SLAVE_NAMES
else
  SLAVE_FILE=${HADOOP_SLAVES:-${HADOOP_CONF_DIR}/slaves}
  SLAVE_NAMES=$(cat "$SLAVE_FILE" sed  's/#.*$//;/^$/d')
fi
# start the daemons
for slave in $SLAVE_NAMES ; do
ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" \
   2>&1 | sed "s/^/$slave: /" &
if "$HADOOP_SLAVE_SLEEP" != "" ]; then
   sleep $HADOOP_SLAVE_SLEEP
fi
done

5)start-dfs.sh  #启动nn,dn,jn,snn (相反关闭为stop-dfs.sh)

启动时调用的命令分布如下

1
2
3
4
#hadoop-daemons.sh --config xxx --script  hdfs start namenode xxx
#hadoop-daemons.sh --config xxx --script  hdfs start datanode  xxx
#hadoop-daemons.sh --config xxx --script  hdfs start journalnode
#hadoop-daemons.sh --config xxx --script  hdfs start secondarynamenode

其中nn,dn的启动时,可以带入-upgrade或者-rollback参数,控制升级和回滚操作
(snn和jn在升级或者回滚时不需要做特殊操作)
nn,jn,snn的启动都需要带入hostname
比如nn:

1
2
3
4
5
6
NAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -namenodes)
echo "Starting namenodes on [$NAMENODES]"
"$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \
  --config "$HADOOP_CONF_DIR" \
  --hostnames "$NAMENODES" \
  --script "$bin/hdfs" start namenode $nameStartOpt

jn:

1
SHARED_EDITS_DIR=$($HADOOP_PREFIX/bin/hdfs getconf -confKey dfs.namenode.shared.edits.dir 2>&-)

#通过获取dfs.namenode.shared.edits.dir的设置

1
2
3
4
5
6
7
8
9
10
case "$SHARED_EDITS_DIR" in
qjournal://*)
  JOURNAL_NODES=$(echo "$SHARED_EDITS_DIR" sed 's,qjournal://\([^/]*\)/.*,\1,g; s/;/ /g; s/:[0-9]*//g')  
  echo "Starting journal nodes [$JOURNAL_NODES]"
  "$HADOOP_PREFIX/sbin/hadoop-daemons.sh" \
      --config "$HADOOP_CONF_DIR" \
       
--hostnames "$JOURNAL_NODES" \
      --script "$bin/hdfs" start journalnode ;;
esac

hdfs解析传入的参数,并最终调用对应的java实现类的main方法。比如
hdfs getconf -namenodes调用java  xxx org.apache.hadoop.hdfs.tools.GetConf -namenodes
hdfs getconf -confKey dfs.namenode.shared.edits.dir调用java xxx  org.apache.hadoop.hdfs.tools.GetConf -confKey dfs.namenode.shared.edits.dir

6)start-secure-dns.sh #kerberos环境下启动dn的脚本

7)start-balancer.sh #启动balance服务(相反关闭为stop-balancer.sh)

#调用hdfs start balancer (org.apache.hadoop.hdfs.server.balancer.Balancer类)

8)start-all.sh  ##start-dfs.sh + start-yarn.sh (相反关闭为stop-all.sh)

yarn相关

1)yarn-daemon.sh

最终调用yarn xxx,比如yarn start nodemanager

2)yarn-daemons.sh

会调用slaves.sh和yarn-daemon.sh

3)start-yarn.sh,(相反关闭为stop-yarn.sh)

#yarn-daemon.sh   start resourcemanager
yarn-daemons.sh   start nodemanager

综上:

以要启动dn为例

1
hadoop-daemons.sh-->hadoop-daemon.sh-->hdfs namenode start---->org.apache.hadoop.hdfs.server.namenode.NameNode类的main方法