前记: 
这些天一直学习Hadoop,学习中也遇到了许多的问题,主要是对hadoop的shell脚本和hadoop的源码概念不够清楚,所以我就对hadoop的bin目录下的shell脚本进行了研究,有一些成果想记录下来,也希望大家前来批评指正。
分析原因: 
很多hadoop的初学者对hadoop的脚本不是很清楚,不知道为什么可以在命令行中启动hadoop,也不知道为什么有时在命令行中运行hadoop命令时会出现java的错误。等等这些问题,究其原因我认为是大家对shell脚本不太了解。我曾学过一些shell编程的知识,可是对hadoop的shell程序细节还不是全部了解,我想从宏观上分析一下hadoop脚本的运行流程。
脚本分析: 
start-all.sh:
# Start all hadoop daemons.  Run this on master node.    
   
bin=`dirname "$0"`    
bin=`cd "$bin"; pwd`    
   
. "$bin"/hadoop-config.sh    
   
# start dfs daemons    
"$bin"/start-dfs.sh --config $HADOOP_CONF_DIR    
   
# start mapred daemons    
"$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的部分代码 
#check to see it is specified whether to use the slaves or the    
# masters file    
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: 
# Start hadoop dfs daemons.    
# Optinally upgrade or rollback dfs state.    
# 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  
       
      
    
        内容版权声明:除非注明,否则皆为本站原创文章。
        转载注明出处:http://www.heiqu.com/pfpgg.html