Hadoop InputFormat&InputSplit&Recorder解析
1 概述
本节我们来介绍InputFormat、InputSplit以及Recorder,了解Hadoop是如何使用这些组件来分割数据的。我们从而掌握这些组件之间的联系和区别。
2 Hadoop InputFormat
Hadoop InputFormat检查作业的输入规范。InputFormat将输入文件分割成InputSplit(输入分片),并分配给独立的mapper。
InputFormat定义了在Hadoop中输入文件如何被分割和读取。在MapReduce中,Hadoop InputFormat是第一个组件,它负责建立输入分片并把它们拆分成记录。
最初,MapReduce任务的数据是存储在输入文件中的,输入文件一般在HDFS上面。这些文件的格式可以是任意的,包括基于行的日志文件以及二进制格式的文件。使用InputFormat,我们可以定义输入文件如何分割和读取。在Hadoop MapReduce框架中,InputFormat类是一个基础类,它提供了如下功能:
- 用于输入的文件或者对象是由InputFormat负责选取的。
- InputFormat定义了数据分片,数据分片定义着单独的map任务的大小以及可能执行的服务。
- InputFormat定义了RecordReader,RecordReader负责从输入文件中读取实际的记录。
2.1 Mapper如何获取数据
在MapReduce中有两个方法负责向mapper提供数据:getsplits()和 createRecordReader() :
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;
}
2.2 MapReduce中InputFormat的类型
下面让我们看看InputFormat有哪些类型。
2.2.1 FileInputFormat
FileInputFormat是所有基于文件的InputFormat的基类。Hadoop FileInputFormat指定了数据文件所在的目录。当我们开始一个Hadoop作业时,包含要读取文件的路径会提供给FileInputFormat。FileInputFormat会读取所有文件,并且把这些文件分割成一个或者更多的输入分片(InputSplit)。