Hadoop1.0.3的start-dfs.sh系列脚本分析

2019-03-28 13:23|来源: 网络

熟悉脚本的启动过程,也就熟悉了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

#说明:然后运行hadoop-daemons.sh脚本,通过参数’start datanode启动所有的datanode,后面将介绍hadoop-daemons.sh脚本介绍datanode的启动脚本的执行过程。

"$bin"/hadoop-daemons.sh--config $HADOOP_CONF_DIR start datanode $dataStartOpt

#说明:最后运行hadoop-daemons.sh脚本,通过参数’—hosts masters start secondarynamenode启动secondarynamenode,后面将介绍hadoop-daemons.sh脚本介绍secondarynamenode的启动脚本的执行过程。

"$bin"/hadoop-daemons.sh--config $HADOOP_CONF_DIR --hosts masters start secondarynamenode

相关问答

更多
  • 现在最新编译好的0.9的不改pom的话就是基于hadoop 1.2.1的,你说的1.0.3是一个hadoop不稳定版本,但本质都是1.x系列的 还有就是1.0.3是一个hadoop不稳定版本,还是换个稳定版本用吧
  • 第一解决方案 设置Hadoop环境变量 $cd ~ $vi .bashrc   paste following to the end of the file   #Hadoop variables export JAVA_HOME=/usr/lib/jvm/jdk/ export HADOOP_INSTALL=/usr/local/hadoop export PATH=$PATH:$HADOOP_INSTALL/bin export PATH=$PATH:$HADOOP_INSTALL/sbin expor ...
  • 我想你错过了这一步“将SSH公钥添加到目标主机上的authorized_keys文件” 只需正确重做无密码的ssh步骤。 按照这个: 生成公钥和私钥SSH密钥 ssh-keygen 将SSH公钥( id_rsa.pub ) id_rsa.pub到目标主机上的root帐户 .ssh/id_rsa .ssh/id_rsa.pub 将SSH公钥添加到目标主机上的authorized_keys文件中 cat id_rsa.pub >> authorized_keys 根据您的SSH版本,您可能需要在目标主机上 ...
  • 通常,每个Hadoop发行版/版本都应该有几个基本脚本文件,如果您有纱线,则可以将此JAVA_HOME环境变量设置为yarn-env.sh文件。 另外,根据您的hadoop版本,您的* -site.xml文件中也可能有路径,例如hdfs-site.xml,core-site.xml,yarn-site.xml,mapred-site.xml和其他一些文件取决于你有什么服务。 很可能您的hadoop-env.sh更新没有重新生成客户端配置文件,除非您通过群集管理器应用程序执行了重新部署的客户端配置文件。 有时 ...
  • 没有JobTracker和TaskTracker了。 我们有NodeManager和resourceManager。 在这里你刚开始dfs服务没有启动纱线服务,启动纱线服务运行start-yarn.sh然后只有纱线相关服务才会启动。 如果你想启动所有服务运行start-all.sh (不是一个好习惯) There is no JobTracker and TaskTracker anymore. We have NodeManager and resourceManager. Here you just s ...
  • 我同意Chris Gerken的评论,你正在运行start-dfs.sh脚本,它只启动HDFS服务。 如果您想要地图缩减服务(作业跟踪器和任务跟踪器),则需要运行start-mapred.sh 。 此外,来自start-all.sh的已弃用消息提示: echo "This script is Deprecated. Instead use start-dfs.sh and start-mapred.sh" I agree with Chris Gerken's comment, you're runnin ...
  • 找出原因,我使用的RHEL的默认shell是csh。 我已经设置了一个自动脚本来将其更改为登录时的bash。 不知何故,它与“#!/ usr / bin / env bash”这一行发生冲突。 一旦我注释掉自动bash开关,它工作正常。 Found out why, the default shell for the RHEL I am using is csh. And I have put an automatic script to change it to bash at login. Someho ...
  • 在.bashrc和hadoop-env.sh中设置环境变量 export HADOOP_HDFS_HOME=$HADOOP_HOME set the environmental variable in your .bashrc and hadoop-env.sh export HADOOP_HDFS_HOME=$HADOOP_HOME
  • 看起来你错过了hadoop home env var。 export HADOOP_HOME=/opt/hadoop 然后尝试是否有任何工作 hadoop version 像你的问题取决于缺乏env var。 Looks like you are missing the hadoop home env var. export HADOOP_HOME=/opt/hadoop then try is anything working hadoop version Issues like yours ...
  • 文档说这是针对getconf 从配置目录中获取配置信息 这是namenodes标志 获取集群中的名称节点列表。 资料来源: https : //hadoop.apache.org/docs/r2.7.1/hadoop-project-dist/hadoop-hdfs/HDFSCommands.html#getconf Documentation says this for getconf Gets configuration information from the configuration direct ...