zl程序教程

您现在的位置是:首页 >  工具

当前栏目

MapReduce源码分析之InputFormat

源码 分析 MapReduce
2023-09-27 14:29:33 时间
        InputFormat描述了一个Map-Reduce作业中的输入规范。Map-Reduce框架依靠作业的InputFormat实现以下内容:         1、校验作业的输入规范;         2、分割输入文件(可能为多个),生成逻辑输入分片InputSplit(往往为多个),每个输入分片InputSplit接着被分配给单独的Mapper;         3、提供记录读取器RecordReader的实现,RecordReader被用于从逻辑输入分片InputSplit收集输入记录,这些输入记录会被交由Mapper处理。

        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()方法,其定义如下:

 public abstract 

 List InputSplit getSplits(JobContext context

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

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

 public abstract 

 RecordReader K,V createRecordReader(InputSplit split,

 TaskAttemptContext context

 ) throws IOException, 

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

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

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




《MapReduce 2.0源码分析与编程实战》一导读 我们处于一个数据大爆炸的时代。每时每刻、各行各业都在产生和积累海量的数据内容。这些数据中蕴含着进行业务活动、获取商业信息、做出管理决策的重要信息。如何处理这些数据并获取有价值的信息,是众多组织和单位面临的共同问题。