Hadoop进程启动过程分析

使用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类









你可能感兴趣的:(Hadoop进程启动过程分析)