http://blog.csdn.net/zklth/article/details/11617479
http://weixiaolu.iteye.com/blog/1397519
使用start-dfs.sh启动hdfs进程的详细过程
涉及的脚本有:
bin下:
hadoop-config.sh
start-dfs.sh
hadoop-daemons.sh
slaves.sh
hadoop-daemon.sh
hadoop
conf下:
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 < /dev/null &
| 例如,这里可能执行的是以下命令,改命令将启动本节点上的 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 < /dev/null &
| 其中的 *** = /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类
阅读(1485) | 评论(0) | 转发(0) |