Hadoop MapReduce Job提交後的互動日誌

weixin_34148340發表於2017-10-09

通過混合 NamdeNode, DataNode, ResourceManager,NodeManager的日誌輸出, 和 提交MapReduce Job的console輸出日誌,形成時間序列上的日誌輸出。

這樣可以方便檢視從client端提交job,整個hadoop的內部互動的大致過程。

MapReduce Job的console輸出來自執行簡單編寫的例子: 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兩個檔案儲存了有關InputSplit的資訊。我們知道,Hadoop MapReduce將所有的輸入檔案劃分成一個一個的InputSplit(劃分規則由InputFormat的實現類定義),且為每一個InputSplit,JobTracker將分配一個task交給TaskTracker去執行map。那麼,在啟動Job之前,首先需要完成檔案劃分,這個實際上是由Client端來執行。Client完成檔案劃分後,將劃分資訊寫入job.split和job.splitmetainfo,然後寫這兩個檔案到staging dir。

接下來的問題是,為什麼需要有兩個檔案,它們分別儲存了什麼樣的資訊?如下圖所示,job.split儲存了所有劃分出來的InputSplit,而每個InputSplit記錄如下資訊:

該Split的型別(ClassName, mostly org.apache.hadoop.mapreduce.lib.input.FileSplit)
該Split所屬檔案的路徑(FilePath)
該Split在所屬檔案中的起始位置(FileOffset)
該Split的位元組長度(Length)

job.splitmetainfo儲存了有關InputSplit的後設資料:
該Split在哪些Node上是local data(Location)
該Split對應的InputSplit在job.split檔案中的位置(SplitFileOffset)
該Split的位元組長度(Length, the same as that in job.split)


job.splitmetainfo提供給JobTracker讀取。比如,根據# Split,JobTracker能知道該分配多少個Task;根據Location,JobTracker能決定將該Split對應的Task分配給哪個Node去執行(優先分配到擁有該Split local data的Node)
job.split提供給TaskTracker讀取。根據FilePath, FileOffset, Length,TaskTracker知道從哪個檔案的哪個位置開始讀取要處理的Split data。

相關文章