MapReduce源码分析之InputFormat

 InputFormat描述了一个Map-Reduce作业中的输入规范。Map-Reduce框架依靠作业的InputFormat实现以下内容:

        1、校验作业的输入规范;

        2、分割输入文件(可能为多个),生成逻辑输入分片InputSplit(往往为多个),每个输入分片InputSplit接着被分配给单独的Mapper;

        3、提供记录读取器RecordReader的实现,RecordReader被用于从逻辑输入分片InputSplit收集输入记录,这些输入记录会被交由Mapper处理。

        基于文件的输入格式的默认行为,作为代表性的子类FileInputFormat,基于输入文件的总大小(单位byte)来切分成逻辑输入分片InputSplit。然而,输入文件的文件系统数据块大小,被用作输入分片大小的上界。输入分片大小的下界则可以在mapred-default.xml配置文件中通过参数mapreduce.input.fileinputformat.split.minsize来配置。

        无疑,由于记录界限应该被遵守,基于输入大小的逻辑输入分片不满足很多应用。在这种情况下,应用不得不实现一个记录阅读器RecordReader,以便遵守记录边界,并提出一个面向记录的逻辑输入分片视图给单个任务。

        InputFormat是一个抽象类,其中,实现分片的是getSplits()方法,其定义如下:

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. public abstract   
  2.   List<InputSplit> getSplits(JobContext context  
  3.                              ) throws IOException, InterruptedException;  

        getSplits()方法为作业在逻辑上切分输入文件集合 。每个输入分片将会被分配给单个Mapper进行处理。注意,这个切分只是对输入进行逻辑上的切分,输入文件并不会在物理上被分割成块。比如,一个分片可能是<输入文件路径,起始位置,长度>元组。InputFormat也会创建记录阅读器RecordReader去读取这个输入分片InputSplit。

 

        而提供记录阅读器的是createRecordReader()方法,其定义如下:

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. public abstract   
  2.   RecordReader<K,V> createRecordReader(InputSplit split,  
  3.                                        TaskAttemptContext context  
  4.                                       ) throws IOException,   
  5.                                                InterruptedException;  

        createRecordReader()方法为给定分片创建一个记录阅读器。在分片被使用之前,框架将调用RecordReader的initialize(InputSplit, TaskAttemptContext)方法完成初始化。它需要两个参数:

 

        1、InputSplit split:需要被读入的分片;

        2、TaskAttemptContext context:任务上下文,存储了任务的相关信息。

posted @ 2016-06-03 15:06  吉日木图  阅读(132)  评论(0编辑  收藏  举报