通过混合 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。