http://blog.csdn.net/zklth/article/details/11617479http://weixiaolu.iteye.com/blog/1397519使用start-dfs.sh启动hdfs进程的详细过程涉及的脚本有:bin下:hadoop-config.sh start-dfs.sh hadoop-daemons.sh slaves.shhadoop-daemon.sh hadoopconf下:hadoop-env.sh 其中 hadoop-config.sh 和 hadoop-env.sh 均是与hadoop环境变量有关的脚本。start-dfs.sh中会调用hadoop-daemon.sh 启动naomenode,调用hadoop-daemons.sh 启动secondarynamenode,调用hadoop-daemons.sh 启动datanode,由于启动datanode的进程是需要在多台节点上启动,所以这里只分析它,其余两个进程的启动都比较简单,参考它就可以理解。start-dfs.sh : 加载 hadoop-config.sh,即 source hadoop-config.sh|||hadoop-daemons.sh : 加载 hadoop-config.sh ; 该脚本在主节点上运行。| 调用slaves.sh并传递参数 : exec "$bin/slaves.sh" --config $HADOOP_CONF_DIR cd "$HADOOP_HOME" \; "$bin/hadoop-daemon.sh" --config $HADOOP_CONF_DIR "$@"| 这里的exec命令: exec| 例如: 执行以下命令启动datanode| exec ***/test_slaves.sh --config ***/../conf cd ***/.. ';' ***/hadoop-daemon.sh --config ***/../conf start datanode| 其中的 *** = /root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin|slaves.sh : 加载 hadoop-config.sh ; 该脚本在主节点上运行,作用是启动所有从节点上的hadoop-daemon.sh进程,让他们并行运行。| 遍历slaves文件中的每个主机,依次执行ssh命令,ssh命令将获取hadoop-daemons.sh中传入该shell脚本的相关参数,在每个远程节点上启动相关进程|| for slave in ` cat "$HOSTLIST" | sed "s/#.*$//;/^$/d" `| do| ssh $HADOOP_SSH_OPTS $slave $"${@// /\\ }" 2>&1 | sed "s/^/$slave: /" &| 例如: 该命令是如下形式| ssh hdfs05 cd ***/.. ';' ***/hadoop-daemon.sh --config ***/../conf start datanode 2>&1 | sed 's/^/hdfs05 : /' &| 将在节点hdfs05上执行命令: cd ***/.. ';' ***/hadoop-daemon.sh --config ***/../conf start datanode 2>&1 | sed 's/^/hdfs05 : /' &| 这个命令将会在从节点的后台运行,这样便能够在主节点上启动所有节点的脚本,各节点脚本并行执行。| 脚本调用了hadoop-daemon.sh。| done| hadoop-daemon.sh : 加载 hadoop-config.sh ,加载hadoop-env.sh,设置hadoop相关环节变量和当前shell的java环境变量, | 该脚本会运行在从节点上,在这个例子里,它由主节点启动,然后自己独立运行,如果要测试该脚本,需要在某节点上独立测试。| 进程的start、stop都在这里处理,| stop时是kill调相关进程,如datanode,比较简单,| 这里根据slaves.sh中传递的参数,是 start datanode,| 进程启动时将会执行以下命令,该命令会在当前节点的后台执行,| nohup nice -n $HADOOP_NICENESS "$HADOOP_HOME"/bin/hadoop --config $HADOOP_CONF_DIR $command "$@" > "$log" 2>&1| 例如,这里可能执行的是以下命令,改命令将启动本节点上的 hadoop 脚本,并且会在后台运行,标准输出在$log中,| 用户测试时可以直接使用 nohup nice -n 0 ***/../bin/hadoop --config ***/../conf datanode | 或者 直接使用hadoop datanode,使用nohup和&只是将其放到后台,并且不挂断的运行,不占据当前shell,具体参看 nohup命令| nohup nice -n 0 ***/../bin/hadoop --config ***/../conf datanode > "$log" 2>&1| 其中的 *** = /root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin,|hadoop : 加载 hadoop-config.sh , 加载hadoop-env.sh,设置hadoop相关环节变量和当前shell的java环境变量,根据前面传递的参数datanode找到相关的java类,启动datanode进程。| 该脚本是在从节点后台运行的,所有标准输出和标准错误信息将写入到 $log 中,这是因为 hadoop-daemon.sh 中的命令作用的原因,| 因此用户需要单独测试该脚本时,需要单独测试,例如使用命令 hadoop datanode 即可测试启动datanode。| 通过参数datanode找到相关的java类 CLASS='org.apache.hadoop.hdfs.server.datanode.DataNode',并且设置java环境变量CLASSPATH,JVM所占内存最大大小,执行java命令运行| Datanode类;| 该脚本中最终是通过执行以下命令来启动相关进程的,如datanode完成 exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH" $CLASS "$@" 该命令可能是如下形式:exec /home/hadoop/jdk1.6.0_07/bin/java java命令-Xmx1000m jvm所占最大内存空间 -Dcom.sun.management.jmxremote -Dhadoop.log.dir=/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/.. -Dhadoop.id.str= -Dhadoop.root.logger=INFO,console -Djava.library.path=/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/native/Linux-amd64-64 -Dhadoop.policy.file=hadoop-policy.xml hadoop 选项$HADOOP_OPTS-classpath /root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../conf:/home/hadoop/jdk1.6.0_07/lib/tools.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/..:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../hadoop-0.20.1-core.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/commons-cli-1.2.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/commons-codec-1.3.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/commons-el-1.0.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/commons-httpclient-3.0.1.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/commons-logging-1.0.4.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/commons-logging-api-1.0.4.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/commons-net-1.4.1.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/core-3.1.1.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/hsqldb-1.8.0.10.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/jasper-compiler-5.5.12.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/jasper-runtime-5.5.12.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/jets3t-0.6.1.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/jetty-6.1.14.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/jetty-util-6.1.14.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/junit-3.8.1.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/kfs-0.2.2.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/log4j-1.2.15.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/oro-2.0.8.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/servlet-api-2.5-6.1.14.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/slf4j-api-1.4.3.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/slf4j-log4j12-1.4.3.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/xmlenc-0.52.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/jsp-2.1/jsp-2.1.jar:/root/hadoop/hadoop-0.20.1/hadoop-0.20.1/bin/../lib/jsp-2.1/jsp-api-2.1.jar 这是 java环境变量 CLASSPATH,DataNode类运行时依赖变量中的jar包org.apache.hadoop.hdfs.server.datanode.DataNode 这是启动DataNode进程的最终java类 09-25 13:50