Hadoop的shell脚本分析

前记:
这些天一直学习Hadoop,学习中也遇到了许多的问题,主要是对hadoop的shell脚本和hadoop的源码概念不够清楚,所以我就对hadoop的bin目录下的shell脚本进行了研究,有一些成果想记录下来,也希望大家前来批评指正。

分析原因:

很多hadoop的初学者对hadoop的脚本不是很清楚,不知道为什么可以在命令行中启动hadoop,也不知道为什么有时在命令行中运行hadoop命令时会出现java的错误。等等这些问题,究其原因我认为是大家对shell脚本不太了解。我曾学过一些shell编程的知识,可是对hadoop的shell程序细节还不是全部了解,我想从宏观上分析一下hadoop脚本的运行流程。

脚本分析:

start-all.sh:

  1. # Start all hadoop daemons.  Run this on master node.   
  2.   
  3. bin=`dirname "$0"`   
  4. bin=`cd "$bin"; pwd`   
  5.   
  6. "$bin"/hadoop-config.sh   
  7.   
  8. # start dfs daemons   
  9. "$bin"/start-dfs.sh --config $HADOOP_CONF_DIR   
  10.   
  11. # start mapred daemons   
  12. "$bin"/start-mapred.sh --config $HADOOP_CONF_DIR  

分析:
正如注释的一样,这个脚本是在master上运行的,即我们运行namenode和jobtracker的主机。它首先启动了hadoop-config.sh脚本,查看hadoop-config.sh,我们可以知道它的作用是对一些变量进行赋值,这些变量有HADOOP_HOME(hadoop的安装目录),HADOOP_CONF_DIR(hadoop的配置文件目录),HADOOP_SLAVES(--hosts指定的文件的地址),为了让大家更好地理解,下面贴出hadoop-config.sh的部分代码

  1. #check to see it is specified whether to use the slaves or the   
  2. # masters file   
  3. if [ $# -gt 1 ]   
then        if [ "--hosts" = "$1" ]        then            shift            slavesfile=$1           shift            export HADOOP_SLAVES="${HADOOP_CONF_DIR}/$slavesfile"       fi  

前面的注释意思是:判断是使用slaves文件,还是master文件,这里为什么要判断呢?那我们带着疑问接着分析下去吧。然后start-all.sh根据hadoop/conf目录下的配置信息启动了start-dfs.sh和start-mapred.sh两个脚本,下面我们去看看这两个脚本又做了些什么吧。

start-dfs.sh:

  1. # Start hadoop dfs daemons.   
  2. # Optinally upgrade or rollback dfs state.   
  3. # Run this on master node.   
   usage="Usage: start-dfs.sh [-upgrade|-rollback]"      bin=`dirname "$0"`    bin=`cd "$bin"; pwd`       "$bin"/hadoop-config.sh       # get arguments    if [ $# -ge 1 ]; then        nameStartOpt=$1       shift        case $nameStartOpt in          (-upgrade)            ;;          (-rollback)             dataStartOpt=$nameStartOpt            ;;          (*)              echo $usage              exit 1           ;;        esac    fi       # start dfs daemons    # start namenode after datanodes, to minimize time namenode is up w/o data    # note: datanodes will log connection errors until namenode starts    "$bin"/hadoop-daemon.sh --config $HADOOP_CONF_DIR start namenode $nameStartOpt    "$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR start datanode $dataStartOpt    "$bin"/hadoop-daemons.sh --config $HADOOP_CONF_DIR --hosts masters start secondarynamenode  

相关推荐