Hadoop的shell脚本分析(4)

分析了以上这些脚本之后,我想还有一些脚本,比如说:start-balancer.sh,start-jobhistoryserver.sh就不需要分析了吧。不过看了这些脚本之后,我们发现脚本都是一个执行另一个脚本,到最后都是执行了Hadoop-daemon.sh。以启动(start)为例,那hadoop-daemon.sh脚本又是怎么来启动那么多的进程的呢?我们又要回到hadoop-daemon.sh的代码了,之前我们看到hadoop-daemon.sh的一段关键代码是用于判断“启动”还是“停止”进程的,在shell中停止一个进程很方便,用kill命令就可以了,但是该脚本是怎么启动进程的呢?我们继续分析脚本中(start)后面的代码,如果你仔细一点,可以发现其实有这样一段代码: "$HADOOP_HOME"/bin/hadoop --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1 < /dev/null &  

分析:
现在你明白我想要说明什么问题了吗,呵呵,其实hadoop-daemon.sh启动进程也是执行了其它的脚本,它就是hadoop/bin/hadoop。其实说到这里hadoop脚本的秘密就快浮出水面了。你还记得博客开头我们提出的问题吗?为什么有时在命令行执行hadoop命令时会出现java的错误信息呢,秘密就在这个hadoop/bin/hadoop脚本里。下面我们来看一下hadoop的核心脚本吧


hadoop:

片段一:    cygwin=false   case "`uname`" in    CYGWIN*) cygwin=true;;    esac       片段二:    for developers, add Hadoop classes to CLASSPATH    if [ -d "$HADOOP_HOME/build/classes" ]; then      CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/classes    fi    if [ -d "$HADOOP_HOME/build/webapps" ]; then      CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build    fi    if [ -d "$HADOOP_HOME/build/test/classes" ]; then      CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/test/classes    fi    if [ -d "$HADOOP_HOME/build/tools" ]; then      CLASSPATH=${CLASSPATH}:$HADOOP_HOME/build/tools    fi          片段三:       elif [ "$COMMAND" = "namenode" ] ; then      CLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'     HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"   elif [ "$COMMAND" = "secondarynamenode" ] ; then      CLASS='org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode'     HADOOP_OPTS="$HADOOP_OPTS $HADOOP_SECONDARYNAMENODE_OPTS"   elif [ "$COMMAND" = "datanode" ] ; then      CLASS='org.apache.hadoop.hdfs.server.datanode.DataNode'      片段四:     exec "$JAVA" -Dproc_$COMMAND $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@"  

分析:
由于篇幅原因,我只贴出了hadoop脚本具有代表价值的四段代码。下面我们一个个来分析吧

片段一:
我们知道在window操作系统上可以通过安装cygwin软件来模拟linux系统环境,这段代码就是用于判断我们的hadoop命令是运行在linux环境上,还是模拟的linux环境上,因为两种情况下文件的路径不相同,hadoop脚本为了区分这两种情况,做出了判断。

片段二:
这些操作是将一些目录的路径自动地加到环境变量(CLASSPATH)中。

片段三:
其实这个片段才是精华,它根据COMMAND的值给CLASS指定一个对应的java类,

片段四:
呵呵,根据CLASS的值,脚本执行了该java类哦,如果你看了hadoop的源码,你会发现,这些类里都有main方法。


小结:
分析到这里,hadoop的shell脚本就全部分析完毕了。如果有不同想法的,希望可以一起交流。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pfpgg.html