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