FileInputFormat

最顶级是InputFormat抽象类 ,该类定义了两个方法,方法getSplits是负责切分输入文件(们)的,把很多的输入文件(们)切分成很多的输入分片,切分规则就是在这里定义的,每个InputSplit对应一个Mapper任务。方法createRecordReader是负责把getSplits生成的很多InputSplit解析成键值对的。InputFormat中的方法getSplits负责拆分输入文件的,方法createRecordReader负责把拆分的数据解析成键值对。这是从两个不同的角度设定的方法,职责不同,功能不同。方法getSplits的返回值是InputSplit的集合。抽象类InputSplit表示每个Mapper任务将要处理的数据,是二进制的,

根据要处理的数据类型不同,InputSplit也有不同的含义,因此会有很多子类。

方法createRecordReader的返回值是一个可以处理键值对的RecordReader。抽象类RecordReader是就是把InputSplit的数据解析成键值对的,提供了解析规则和读取键值对的方法,

根据数据不同,解析规则也会不同,因此会有很多子类。

根据解析的数据不同,InputFormat的子类有DBInputFormat、DelegatingInputFormat和FileInputFormat。其中,DBInputFormat是专门用于加载数据库中的数据的,如mysql、oracle等;FileInputFormat是专门用于处理文件中的数据的;DelegatingInputFormat是把其他各种InputFormat组成到一起的委托接口。从功能可以看出,FileInputFormat是用途最广的,其次是DBInputFormat,再次是DelegatingInputFormat。

FileInputFormat

该类是专门处理文件的,该类提供了如何计算输入分片(InputSplit)的方法。每个InputSplit对应一个运行的Mapper任务,因此InputSplit的数量决定了运行的Mapper任务数量,InputSplit的大小决定了每个Mapper任务处理数据量的大小。在这里,使用的是InputSplit的子类FileSplit。类FileSplit是专门用于处理输入文件的,会按照固定的字节数对每个输入文件进行拆分,拆分成很多的FileSplit。

根据文件的不同,对FileSplit解析成键值对的方式也有很多。因此,FileInputFormat会有很多的子类,包括TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineFileInputFormat和SequenceFileInputFormat。

输入格式化类的作用有两个:

  • 设定Mapper任务数量——通过getSplits方法实现;
  • 把输入文件的内容解析成键值对,供map函数调用——通过createRecordReader方法实现;
时间: 2024-11-01 18:44:13

FileInputFormat的相关文章

FileInputFormat FileOutputFormat

MapReduce框架要处理数据的文件类型和要输出的文件类型由这两个类决定. TextInputFormat是框架默认的文件类型,可以处理Text文件类型,如果你要处理的文件类型不是Text, 譬如说是Xml或DB,你就需要自己实现或用库中已有的类型. FileInputFormat的主要方法之一getSplits完成的功能是获取job要处理的路径文件所在的block信息. 数据结构:InputSplit 存储了文件的位置信息,如Host,还有长度信息. 方法介绍: 计算splitsize的方法

整个文件作为一条记录处理自定义FileInputFormat类

众所周知,Hadoop对处理单个大文件比处理多个小文件更有效率,另外单个文件也非常占用HDFS的存储空间.所以往往要将其合并起来. 1,getmerge hadoop有一个命令行工具getmerge,用于将一组HDFS上的文件复制到本地计算机以前进行合并 参考:http://hadoop.apache.org/common/docs/r0.19.2/cn/hdfs_shell.html 使用方法:hadoop fs -getmerge <src> <localdst> [addnl

在Hadoop中重写FileInputFormat类以处理二进制格式存储的整数

最近开始使用MapReduce,发现网上大部分例子都是对文本数据进行处理的,也就是说在读取输入数据时直接使用默认的TextInputFormat进行处理即可.对于文本数据处理,这个类还是能满足一部分应用场景.但是如果要处理以二进制形式结构化记录存储的文件时,这些类就不再适合了. 本文以一个简单的应用场景为例:对按照二进制格式存储的整数做频数统计.当然,也可以在此基础上实现排序之类的其他应用.实现该应用的主要难点就是如何处理输入数据.参考<权威指南·第三版>得知需要继承FileInputForm

Hadoop 2.6.0 FileSplit和InputSplit和FileInputFormat

InputSplit 有三个方法 1.getLengh(),为了获取字节长度 2.getLocations(),获取地址,在哪个节点 3.该方法返回空,返回类型是可支持在内存中存储,或者磁盘存储.可以看出未来mapreduce有希望支持内存存储数据. @Evolving public SplitLocationInfo[] getLocationInfo() throws IOException { return null; } --------------------------------分

MapReduce程序中的万能输入FileInputFormat.addInputPaths

写MR过程中经常会遇到多个源路径的输入,我们可以在MR程序主函数中通过FileInputFormat.addInputPaths(job,args[0])方法来实现, args[0]可以是folder1或者folder1,folder2只要以逗号分隔就可以了. 这样在执行MR的时候,输入会将多个源路径全部多为map输入进行执行. 另外一种实现单输入的方法(只支持一个目录作为输入目录): FileInputFormat.setInputPaths(job, new Path(args[0]));

Hadoop2.6.0的FileInputFormat的任务切分原理分析(即如何控制FileInputFormat的map任务数量)

前言 首先确保已经搭建好Hadoop集群环境,可以参考<Linux下Hadoop集群环境的搭建>一文的内容.我在测试mapreduce任务时,发现相比于使用Job.setNumReduceTasks(int)控制reduce任务数量而言,控制map任务数量一直是一个困扰我的问题.好在经过很多摸索与实验,终于梳理出来,希望对在工作中进行Hadoop进行性能调优的新人们有个借鉴.本文只针对FileInputFormat的任务划分进行分析,其它类型的InputFormat的划分方式又各有不同.虽然如

Hadoop FileInputFormat实现原理及源码分析

FileInputFormat(org.apache.hadoop.mapreduce.lib.input.FileInputFormat)是专门针对文件类型的数据源而设计的,也是一个抽象类,它提供两方面的作用: (1)定义Job输入文件的静态方法: (2)为输入文件形成切片的通用实现: 至于如何将切片中的数据转换为一条条的“记录”则根据文件类型的不同交由具体的子类负责实现. FileInputFormat input paths FileInputFormat提供了四个静态方法用于定义Job的

继承FileInputFormat类来理解 FileInputFormat类

import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.fs.BlockLocation; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apa

MapReduce对输入多文件的处理2自定义FileInputFormat类

多种自定义文件格式的文件输入处理 MultipleInputs可以让MR支持多种输入格式 比如我们有两种文件格式,那么我们就要有两套Record Class,RecordReader和InputFormat InputFormat(extends FileInputFormat)--->RecordReader(extends RecordReader)--->RecordClass(implements Writable) MultipleInpts需要不同的InputFormat,一种In