搞清楚 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
有圖有真相:

送出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();