MapReduce编程模型1 —— InputFormat简介

本文深入探讨了MapReduce作业中InputFormat的作用与实现,包括如何验证输入规范、将输入文件拆分为逻辑InputSplits,以及提供RecordReader实现,用于收集输入记录供Mapper处理。文章还详细介绍了InputSplit和InputFormat的抽象类定义,以及基于文件的InputFormats的默认行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

概述

InputFormat描述了MapReduce Job的输入规范。

Map-Reduce框架依赖作业的InputFormat完成如下工作:

1.验证作业的输入规范;

2.将输入文件拆分为逻辑 InputSplits,然后将每一个分片分配给一个独立的  Mapper

3.提供 RecordReader 的实现,用于从逻辑 InputSplit 中收集输入记录,供 Mapper 处理。

基于文件的 InputFormats (通常是 FileInputFormat 的子类)的默认行为是根据输入文件的总大小(以字节为单位)将输入拆分为逻辑InputSplits。但是,输入文件的 FileSystem 块大小被视为InputSplits 的上限。可以通过 mapreduce.input.fileinputformat.split.minsize。设置分片大小的下限。

显然,基于输入大小的逻辑拆分对于许多应用程序来说是不够的,因为需要考虑记录边界。在这种情况下,应用程序还必须实现一个RecordReader,它负责处理记录边界( record-boundaries),并将面向记录的逻辑 InputSplit 视图提交给单个任务。

 

InputSplit

从上面的描述可知,InputFormat 的主要工作就是将输入数据分割为一个个的 InputSplit。InputSplit是一个抽象类,其定义如下:

public abstract class InputSplit {

  public abstract long getLength() throws IOException, InterruptedException;

  public abstract 
    String[] getLocations() throws IOException, InterruptedException;
  
  @Evolving
  public SplitLocationInfo[] getLocationInfo() throws IOException {
    return null;
  }
}

 

抽象类 InputSplit 有三个方法,getLength 用以获取 InputSplit 的大小,这样 InputSplit 就可以按照大小进行排序。getLocations 用以获取存储分片的节点列表,而 getLocationInfo 用以获取关于InputSplit存储的节点以及其是如何在每个位置存储的相关信息。

 

InputFormat

 

了解了 InputSplit 的基本构造,我们来看看 InputFormat 的定义,如下:

public abstract class InputFormat<K, V> {
  public abstract 
    List<InputSplit> getSplits(JobContext context
                               ) throws IOException, InterruptedException;
  
  public abstract 
    RecordReader<K,V> createRecordReader(InputSplit split,
                                         TaskAttemptContext context
                                        ) throws IOException, 
                                                 InterruptedException;

}

抽象类 InputFormat 有两个方法,getSplits 用以获取将输入文件进行split后的分片列表。注意,这里所谓的分片只是逻辑的,输入文件并不会被物理的拆分。比如一个分片可能是由 <input-file-path,start,offset> 这样的tuple构成。InputFormat 将会创建RecordReader来读取分片。createRecordReader 方法,顾名思义,就是用来创建 RecordReader 的。

InputFormat 有很多的实现类,下面是InputFormat类继承结构图,其中最常用的是 FileInputFormat及其子类(TextInputFormat、SequenceFileInputFormat)

 

InputFormat

 

 

参考:

http://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapred/InputFormat.html

https://blog.youkuaiyun.com/diyibeichaaixiaoyu/article/details/25043445

https://blog.youkuaiyun.com/posa88/article/details/7897963

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值