【Hadoop】MapReduce Job Submission Files

整个MapReduce Job运行流程的最初几步是Client向JobTracker提交Job,如下图所示,图中第三步是将Job运行相关资源提交到JobTracker可见的文件系统上。本文将讨论Client需要提交的几个主要文件。



下图列出了提交到staging dir上的几个文件:首先,显而易见的是,job.jar包含Job要执行的程序(jar文件是从Client local复制到staging dir,其他文件是直接在staging dir上生成);job.xml包含所有配置信息(所有可配置的properties)。下面将讨论余下的两个文件。


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)


现在回到最初的问题,为什么需要分开两个文件存储这些信息?我的理解是,它们分别提供给不同的entity来读取:
  • job.splitmetainfo提供给JobTracker读取。比如,根据# Split,JobTracker能知道该分配多少个Task;根据Location,JobTracker能决定将该Split对应的Task分配给哪个Node去执行(优先分配到拥有该Split local data的Node)
  • job.split提供给TaskTracker读取。根据FilePath, FileOffset, Length,TaskTracker知道从哪个文件的哪个位置开始读取要处理的Split data。

最后来看看job.split和job.splitmetainfo实际的内容,分别如下两图所示(该MapReduce Job运行在Local Mode)。

job.split:


job.splitmetainfo:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值