天天看點

hadoop jar xxxx.jar 執行的流程

搞清楚 hadoop jar xxxx.jar 執行的流程: jar檔案是如何分發的

JobClient(不一定是hadoop叢集的節點)利用bin/hadoop腳本運作jar包,以hadoop-0.20.2-examples.jar為例子:

hadoop jar

hadoop-0.20.2-examples.jar

[class name]的實質是:

1.利用hadoop這個腳本啟動一個jvm程序;

2.jvm程序去運作org.apache.hadoop.util.RunJar這個java類;

3.org.apache.hadoop.util.RunJar解壓hadoop-0.20.2-examples.jar到hadoop.tmp.dir/hadoop-unjar*/目錄下;

4.org.apache.hadoop.util.RunJar動态的加載并運作Main-Class或指定的Class;

5.Main-Class或指定的Class中設定Job的各項屬性

6.送出job到JobTracker上并監視運作情況。

注意:以上都是在jobClient上執行的。

運作jar檔案的時候,jar會被解壓到hadoop.tmp.dir/hadoop-unjar*/目錄下(如:/home/hadoop/hadoop-fs/dfs/temp/hadoop-

unjar693919842639653083, 注意:這個目錄是JobClient的目錄,不是JobTracker的目錄)。解壓後的檔案為:

drwxr-xr-x 2 hadoop hadoop 4096 Jul 30 15:40 META-INF

drwxr-xr-x 3 hadoop hadoop 4096 Jul 30 15:40 org

有圖有真相:

hadoop jar xxxx.jar 執行的流程

送出job的實質是:

生成${job-id}/job.xml檔案到hdfs://${mapred.system.dir}/(比如hdfs://bcn152:9990/home/hadoop/hadoop-fs/dfs/temp/mapred/system/job_201007301137_0012/job.xml),job的描述包括jar檔案的路徑,map|reduce類路徑等等.

上傳${job-id}/job.jar檔案到hdfs://${mapred.system.dir}/(比如hdfs://bcn152:9990/home/hadoop/hadoop-fs/dfs/temp/mapred/system/job_201007301137_0012/job.jar)

生成job之後,通過static

JobClient.runJob()就會向jobTracker送出job:

JobClient jc = new JobClient(job);

RunningJob rj = jc.submitJob(job);

之後JobTracker就會排程此job,

送出job之後,使用下面的代碼擷取job的進度:

try {

if (!jc.monitorAndPrintJob(job, rj)) {

throw new IOException("Job failed!");

}

} catch (InterruptedException ie) {

Thread.currentThread().interrupt();