熟悉脚本的启动过程,也就熟悉了Hadoop的执行过程。所以研究并学习hadoop的脚本启动过程是非常有意义的。
对shell命令不是太熟悉,学的比较辛苦,里面还有些地方不明白,或者有错误的地方,希望如果有错误,能有人帮我指出来,谢谢。
(1)start-dfs.sh脚本
1)说明
start-dfs.sh可以单独运行,也可以启动start-all.sh时启动dfs进程。
start-dfs.sh的作用在于启动主节点的namenode,启动secondnamenode,以及各从节点的datanode进程。
脚本注释中有以下三句话:
start-dfs支持upgrage和rollback两个参数,来更改系统的状态。其中upgrage用于升级hdfs文件系统;如果升级失败,可以用rollback对系统进行回滚。具体情况还不太明了。
最后,Run this on master node说明了必须在namenode进程运行的节点上运行该脚本。如果不在core-size.xml文件定义的fs.default.name变量的机器名运行start-dfs.sh或者start-daemon.sh或者hadoop namenode,是无法成功启动namenode守护进程的。已经经过验证。stop-dfs也是一样的。原因:在hadoop脚本中可以看出namenode进程是在本地启动的,所以如果不在core-site.xml定义的节点上运行start-dfs脚本,不会ssh到该节点上去启动namenode。这部分在后续会进行介绍。
2)脚本执行过程
由于脚本不长,而且其它脚本前面的处理也一致,所以对这个脚本作详细说明。后面的几个脚本就挑主要部分进行解释。
#说明:定义usage变量,即start-dfs.sh的使用说明,在后面的内容可以看到,当参数输入错误时,会打印该消息。
usage="Usage: start-dfs.sh[-upgrade|-rollback]"
#说明:定义bin变量,即hadoop home目录中bin所在目录,也即运行start-dfs所在的目录。写这段脚本的作用在于,当不是在bin目录下运行该脚本时,采用绝对路径的方式,获取hadoop home目录,并在后面的脚本中,使用该路径来读取配置文件、运行其它脚本等。
bin=`dirname"$0"`
bin=`cd"$bin"; pwd`
#说明:运行配置脚本配置脚本主要定义了一些环境变量;并且得到HADOOP根目录,变量名为:HADOOP_PREFIX。(HADOOP_HOME环境变量已经过时)
if [ -e"$bin/../libexec/hadoop-config.sh" ]; then
."$bin"/../libexec/hadoop-config.sh
else
. "$bin/hadoop-config.sh"
fi
#说明:处理脚本命令的参数。如果参数个数>=1,将第一个参数赋值给nameStartOpt变量。如果该变量不为-upgrage和-rollback中的任何一个,就打印usage变量消息(前面第一行就是usage的变量定义),并且退出,不再继续执行。
# get arguments
if [ $# -ge 1 ]; then
nameStartOpt=$1
shift
case $nameStartOpt in
(-upgrade)
;;
(-rollback)
dataStartOpt=$nameStartOpt
;;
(*)
echo $usage
exit 1
;;
esac
fi
#说明:启动dfs的所有后台进程。
# start dfs daemons
# start namenode afterdatanodes, to minimize time namenode is up w/o data
# note: datanodes willlog connection errors until namenode starts
#说明:首先运行hadoop-daemon.sh脚本,通过参数’start namenode’启动namenode,后面将介绍hadoop-daemons.sh脚本介绍namenode的启动脚本的执行过程。
"$bin"/hadoop-daemon.sh--config $HADOOP_CONF_DIR start namenode $nameStartOpt