1.目的
Hadoop InputFormat检查作业的输入规范。 InputFormat将输入文件分割成InputSplit并分配给各个Mapper。 我们将了解什么是Hadoop MapReduce中的InputFormat,获取数据到映射器的不同方法以及Hadoop中不同类型的InputFormat,比如Hadoop中的FileInputFormat,TextInputFormat,KeyValueTextInputFormat等。我们还将看到什么是 Hadoop中的默认InputFormat。
2.什么是Hadoop InputFormat?
InputFormat定义了输入文件如何拆分并在Hadoop中读取。 Hadoop InputFormat是Map-Reduce中的第一个组件,它负责创建inputsplit并将它们分成记录。
最初,MapReduce任务的数据存储在输入文件中,而输入文件通常驻留在HDFS中。虽然这些文件格式是任意的,但可以使用基于行的日志文件和二进制格式。使用InputFormat我们定义了这些输入文件是如何拆分和读取的。 InputFormat类是Hadoop MapReduce框架中的基本类之一,它提供了以下功能:
用于输入的文件或其他对象由InputFormat选择;
InputFormat定义了数据拆分,它定义了各个Map任务及其将要执行服务器的大小;
InputFormat定义了RecordReader,它负责从输入文件中读取实际记录。
3.如何获取数据给mapper?
有两种方法将数据获取到MapReduce中的映射器: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; }
4. MapReduce中的InputFormat类型
4.1 ?Hadoop中的FileInputFormat
它是所有基于文件的InputFormat的基类。 Hadoop FileInputFormat指定数据文件所在的输入目录。当我们启动一个Hadoop作业时,FileInputFormat提供了一个包含要读取的文件的路径。 FileInputFormat将读取所有文件并将这些文件分成一个或多个InputSplits。
4.2 TextInputFormat
它是MapReduce的默认InputFormat。 TextInputFormat将每个输入文件的每一行视为单独的记录,并不执行分析。这对于未格式化的数据或基于行的记录(如日志文件)非常有用。
键 – 它是文件内行开头的字节偏移量(不是整个文件只是一个inputsplit),因此如果与文件名一起使用,它将是唯一的。
Value – 这是该行的内容,不包括行结束符。
4.3 ?KeyValueTextInputFormat
它与TextInputFormat类似,因为它也将每行输入视为单独的记录。虽然TextInputFormat将整行视为值,但KeyValueTextInputFormat通过制表符(‘/ t’)将行本身分解为键和值。这里键是行首直到制表符,而值是制表符后的行剩余部分。
4.4 ?SequenceFileInputFormat
Hadoop SequenceFileInputFormat是一个读取序列文件的InputFormat。序列文件是存储二进制键值对序列的二进制文件。序列文件是块压缩的,并提供几种任意数据类型(不仅仅是文本)的直接序列化和反序列化。这里的键和值都是用户自定义的。
4.5 ?SequenceFileAsTextInputFormat
Hadoop SequenceFileAsTextInputFormat是SequenceFileInputFormat的另一种形式,它将序列文件键值转换为Text对象。通过调用‘tostring()‘转换是在键和值上执行的。这个InputFormat使序列文件适合输入流。
4.6 SequenceFileAsBinaryInputFormat
Hadoop SequenceFileAsBinaryInputFormat是一个SequenceFileInputFormat,我们可以使用它来提取序列文件的键和值作为不透明的二进制对象。
4.7 ?NLineInputFormat
Hadoop NLineInputFormat是TextInputFormat的另一种形式,其中键是行的字节偏移量,值是行的内容。每个映射器都接收可变数量的带有TextInputFormat和KeyValueTextInputFormat的输入行,数量取决于分割的大小和行的长度。如果我们希望我们的映射器接收固定数量的输入行,那么我们使用NLineInputFormat。
N是每个映射器接收的输入行数。默认情况下(N = 1),每个映射程序只接收一行输入。如果N = 2,那么每个输入分割包含两行。一个映射器将接收前两个键值对,另一个映射器将接收后两个键值对。
4.8 ?DBInputFormat
Hadoop DBInputFormat是一个InputFormat,它使用JDBC从关系数据库中读取数据。由于它没有分割功能,所以需要小心不要从数据库中创建过多的映射器。加载相对较小的数据集是最好的。
5.结论
总之,我们可以说InputFormat定义了如何分割和读取输入文件。 InputFormat定义了RecordReader。也可以为不同的目的使用不同类型的InputFormat。