zoukankan      html  css  js  c++  java
  • 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:任务上下文,存储了任务的相关信息。

  • 相关阅读:
    网络编程
    Python之异常处理
    python第31天作业(面向对象高级)
    day01_计算机的基础介绍
    第一章/第二章课后习题
    day12
    day11
    day09-10
    day08
    day07
  • 原文地址:https://www.cnblogs.com/jirimutu01/p/5556340.html
Copyright © 2011-2022 走看看