通過混合 NamdeNode, DataNode, ResourceManager,NodeManager的日志輸出, 和 提交MapReduce Job的console輸出日志,形成時(shí)間序列上的日志輸出。
這樣可以方便查看從client端提交job,整個(gè)hadoop的內(nèi)部交互的大致過程。
MapReduce Job的console輸出來自執(zhí)行簡單編寫的例子: bin/hadoop jar hellohadoop-1.0-SNAPSHOT.jar WordCount demo out 后的輸出。
HDFS文件中保存job的位置在 /tmp/hadoop-yarn/staging/bruce/.staging/job_1449210909990_0001下。
可以看到文件:
appTokens
job.jar
job.split
job.splitmetainfo
job.xml
job.split和job.splitmetainfo兩個(gè)文件存儲(chǔ)了有關(guān)InputSplit的信息。我們知道,Hadoop MapReduce將所有的輸入文件劃分成一個(gè)一個(gè)的InputSplit(劃分規(guī)則由InputFormat的實(shí)現(xiàn)類定義),且為每一個(gè)InputSplit,JobTracker將分配一個(gè)task交給TaskTracker去執(zhí)行map。那么,在啟動(dòng)Job之前,首先需要完成文件劃分,這個(gè)實(shí)際上是由Client端來執(zhí)行。Client完成文件劃分后,將劃分信息寫入job.split和job.splitmetainfo,然后寫這兩個(gè)文件到staging dir。
接下來的問題是,為什么需要有兩個(gè)文件,它們分別存儲(chǔ)了什么樣的信息?如下圖所示,job.split存儲(chǔ)了所有劃分出來的InputSplit,而每個(gè)InputSplit記錄如下信息:
該Split的類型(ClassName, mostly org.apache.hadoop.mapreduce.lib.input.FileSplit)
該Split所屬文件的路徑(FilePath)
該Split在所屬文件中的起始位置(FileOffset)
該Split的字節(jié)長度(Length)
job.splitmetainfo存儲(chǔ)了有關(guān)InputSplit的元數(shù)據(jù):
該Split在哪些Node上是local data(Location)
該Split對(duì)應(yīng)的InputSplit在job.split文件中的位置(SplitFileOffset)
該Split的字節(jié)長度(Length, the same as that in job.split)
job.splitmetainfo提供給JobTracker讀取。比如,根據(jù)# Split,JobTracker能知道該分配多少個(gè)Task;根據(jù)Location,JobTracker能決定將該Split對(duì)應(yīng)的Task分配給哪個(gè)Node去執(zhí)行(優(yōu)先分配到擁有該Split local data的Node)
job.split提供給TaskTracker讀取。根據(jù)FilePath, FileOffset, Length,TaskTracker知道從哪個(gè)文件的哪個(gè)位置開始讀取要處理的Split data。