1. 程式人生 > >Hadoop的作業提交過程

Hadoop的作業提交過程

1.JobClient呼叫FileInputFormat.getSplits(),如果資料檔案是isSplitable()的話,會將大的檔案分解成小的FileSplit,記錄檔案
在HDFS裡的路徑及偏移量和Split大小。這些資訊會統一打包到jobFile的jar中。
2.JobClient然後使用submitJob(job)方法向master提交作業。submitJob(job)內部是通過submitJobInternal(job)方法完成實質性的作業提交。 submitJobInternal(job)方法首先會向hadoop分佈系統檔案系統hdfs依次上傳三個檔案: job.jar, job.split和job.xml。
    job.xml: 作業配置,例如Mapper,Combiner, Reducer的型別,輸入輸出格式的型別等。
    job.jar: jar包,裡面包含了執行此任務需要的各種類,比如 Mapper,Reducer等實現。
    job.split: 檔案分塊的相關資訊,比如有資料分多少個塊,塊的大小(預設64m)等。
這三個檔案在hdfs上的路徑由hadoop-default.xml檔案中的mapreduce系統路徑mapred.system.dir屬性+jobid決定。mapred.system.dir屬性預設是/tmp/hadoop-user_name/mapred/system。寫完這三個檔案之後,此方法會通過RPC呼叫master節點上的JobTracker.submitJob(job)方法,此時作業已經提交完成。

3.JobTracker會根據從HDFS獲取的Job的Split資訊(job.split,job.splitMetaInfo檔案)生成對應的Map輸入資料陣列JobSplit.TaskSplitMetaInfo[],用於對map任務進行初始化(在createSplits中)。TaskSplitMetainfo中儲存的TaskSplitIndex指明瞭該split在job.split檔案中的位置(即1:job.split在TT本地的目錄,2,該split資訊在job.split檔案中的偏移量)。


4.在TT開始執行任務前,會首先從HDFS中將job.split,job.jar等檔案拷貝到本地(copyToLocal), 從JT端收到任務指令後,其中包括這個
TaskSplitIndex,其根據TaskSplitIndex從job.split中讀取InputSplit資訊,開始執行任務。



job.split存放所有分片資訊, job.splitmetainfo存放所有分片的元資料資訊