5.2 作业提交过程详解

在第3章中,我们介绍了Hadoop提供的三种应用程序开发方法,包括原始Java API、Hadoop Streaming和Hadoop Pipes,考虑到后两种方法的底层实际上均调用了Java API,因此,在本节中,我们以Java MapReduce程序为例讲解作业提交过程。

5.2.1 执行Shell命令

假设用户采用Java语言编写了一个MapReduce程序,并将其打包成xxx.jar,然后通过以下命令提交作业:


$HADOOP_HOME/bin/hadoop jar xxx.jar\

-D mapred.job.name="xxx"\

-D mapred.reduce.tasks=2\

-files=blacklist.txt, whitelist.txt\

-libjars=third-party.jar\

-archives=dictionary.zip\

-input/test/input\

-output/test/output


当用户输入以上命令后,bin/hadoop脚本根据“jar”命令将作业交给RunJar类处理,相关shell代码如下:


……

elif["$COMMAND"="jar"];then

CLASS=org.apache.hadoop.util.RunJar

……


RunJar类中的main函数经解压jar包和设置环境变量后,将运行参数传递给MapReduce程序,并运行之。

用户的MapReduce程序已经配置了作业运行时需要的各种信息(如Mapper类,Reducer类,Reduce Task个数等),它最终在main函数中调用JobClient.runJob函数(新MapReduce API则使用job.waitForCompletion(true)函数)提交作业,这之后会依次经过图5-2所示的函数调用顺序才会将作业提交到JobTracker端。

5.2 作业提交过程详解 - 图1

图 5-2 作业提交过程中函数调用关系