org.apache.hadoop.mapreduce.InputFormat 是一个抽象类,
关于这个抽象类的功能描述如下:
1、首先为Job验证输入;
2、将输入的文件分成逻辑上的splits,每个split会被应用到一个单独的mapper上;
3、提供RecorderReader的实现,用来从逻辑split中一点一点的收集数据到mapper中。
这个抽象类中,有两个抽象方法需要实现:
1. public abstract List<InputSplit> getSplits(JobContext context) throws IOException, InterruptedException;
从方法名和它的返回类型就可以猜到,这个接口主要责任就是将一大堆的输入文件分成一系列的splits(每个split是用一个InputSplit对象来表示)。然后每个InputSplit被传递给不同的mapper进行处理。但是要注意,分片仅仅是逻辑上的分片,并不是真地将文件分成多块了。一个分片可以用(输入文件路径,开始位置,偏移量)元组来表示。
2. public abstract RecordReader<K,V> createRecordReader(InputSplit split, TaskAttemptContext context ) throws IOException, InterruptedException;
这个接口的责任是返回一个读取器,来读取这种InputFormat的分片文件,至于怎么读取,就是一种读取策略了,Hadoop框架自身实现了一些,我们当然也可以实现自己的策略满足自己的需求。
在Hadoop中最常用的就是文件作为 job 的输入,这个是由抽象类 FileInputFormat 和 其子类来实现的,它将输入的文件按照大小进行分片。文件系统的块大小被看作是分片的一个上界。下界可以通过设定mapred.min.split.size来指定。基于文件大小的这种逻辑分片方法有的时候是低效的,因为这个时候我们必须去关注边界上的记录是否完整并做出特殊处理,只有这样处理之后,确保没有中间截断的记录,这样才能够传递给mapper来进行进一步的处理。
其中的FileInputFormat继承自InputFormat,但是只是实现了getSplits方法,另一个获取读取器的方法没有实现,这样做是有道理的,因为很多不同格式的文件需要使用不同的读取器来提取数据,比如lzo压缩后的文件的读取器,要先解压后才能读取。
源代码中形成splits列表的逻辑大概是这样的:
首先会从 job 对象中所有的输入文件的列表提取出来
List<FileStatus>files = listStatus(job);
然后就要对每个文件进行逻辑分片了,
分片的逻辑大概是这样的:
首先计算这个文件的长度(按照字节),然后将这个文件的块信息拿出来。如果这个文件可以被分片并且长度不是0,那么就开始进行逻辑分片。每个分片的大小通过函数computeSplitSize来计算。然后如果文件的剩余长度是分块的1.1倍以上的话,就创建一个新分片:
splits.add(new FileSplit(path, length-bytesRemaining, splitSize, blkLocations[blkIndex].getHosts()));
进而,将剩余长度减去已经被分配掉的splitSize,这样循环直到不满足条件。等循环完成之后,如果还有剩余的部分,那么剩下就可以再做一个分片,加入到列表中。
但是,如果我们一开始输入的文件的大小是不可分割的话,那么我们就把整个文件作为一个分片,形成一个实例:
splits.add(new FileSplit(path, 0, length, blkLocations[0].getHosts()));
如果这个文件是可分割的,但是长度是0,也做一个默认的分片:
splits.add(new FileSplit(path, 0, length, new String[0]));
这样,文件的分片列表就产生了,然后读取器就可以从这些分片中按照相应的读取逻辑来读取数据,并交给mapper进行处理了。
-----转载自 http://xiaoxia001.iteye.com/blog/1332880
分享到:
相关推荐
Hadoop 代码使用方式 ...hadoop jar hadoop-mapreduce-custom-inputformat-1.0-SNAPSHOT.jar org.apache.hadoop.mapreduce.sample.SmallFileWordCount -Dmapreduce.input.fileinputformat.split.maxsize=10
编写Map函数,从InputFormat中读取数据,解析每个URL的HTML内容。Reduce函数则负责聚合和处理这些数据,可能包括统计、分类等操作。 8. **数据分析与结果读取** MapReduce完成后,结果将保存在HDFS上。可以使用...
例如,使用Hadoop的InputFormat和OutputFormat接口,开发者可以定义自定义的数据输入和输出格式。同时,Hadoop的Configuration类使得配置参数变得简单,而FileSystem API则允许开发者操作HDFS上的文件。 在实际开发...
7. **扩展性与插件开发**:学习如何为Hadoop开发自定义InputFormat、OutputFormat、Partitioner、Combiner等组件。 8. **实战项目**:结合实际案例,运用所学知识解决大数据处理问题,如日志分析、推荐系统等。 ...
在使用Hadoop-LZO之前,需要将其添加到Hadoop的类路径中。这通常涉及到编译源代码,生成jar包,并将其复制到Hadoop的lib目录下。然后,在Hadoop的配置文件中,如core-site.xml或mapred-site.xml,设置相应的参数,如...
在Hadoop MapReduce框架中,InputFormat是处理输入数据的核心组件。它负责将原始数据分割成逻辑上的键值对(key-value pairs),然后为每个分区分配一个或多个这些键值对给Mapper。默认情况下,Hadoop支持如...
通过对Hadoop源代码中IDs类与Context类的分析,我们可以看到这些类在Hadoop MapReduce框架中扮演着非常关键的角色。它们不仅确保了作业和任务的唯一标识,还为任务执行提供了必要的上下文环境。理解这些核心组件的...
2. **Chap 2 - 数据输入与输出**:这章可能包含如何使用Hadoop的InputFormat和OutputFormat类来定义数据的读取和写入方式。读者可以学习如何自定义输入分片(Splits)和Mapper/Reducer任务。 3. **Chap 3 - ...
在Hadoop的生态系统中,MapReduce是处理海量数据的一种编程模型,而InputFormat作为MapReduce编程模型的重要组成部分,是负责处理输入数据的关键接口。为了深入理解MapReduce工作原理,必须掌握InputFormat的设计和...
此外,`源码`标签提示我们关注代码实现的细节,这可能包括对Hadoop API的使用,如`JobConf`、`InputFormat`、`OutputFormat`等。`工具`标签可能意味着这个案例中还涉及到了其他辅助工具或库,例如Hadoop命令行工具,...
集群中的节点可以通过Hadoop的ResourceManager和NodeManager进行管理和监控。 6. **Hadoop生态系统**:Hadoop不仅仅是MapReduce和HDFS,还包括一系列相关的项目,如Hive(SQL-like查询工具)、Pig(数据分析平台)...
`org.apache.hadoop.mapreduce`包包含了许多类和接口,如`Job`、`Mapper`、`Reducer`和`InputFormat`等,它们是构建MapReduce程序的基础。 3. **MapReduce编程模型**:Map阶段将输入数据拆分成键值对,然后应用用户...
在Hadoop生态系统中,"share"包是一个非常重要的组成部分,它包含了Hadoop项目的基础资源和通用组件。这个包的设计目的是为了提供一个共享的环境,使得各个模块之间可以互相依赖,同时减少代码重复,提高整体效率。...
在Java接口中,主要通过`org.apache.hadoop.fs`包下的类与HDFS进行交互。 1. **文件系统接口**: Hadoop的`FileSystem`接口是所有文件操作的基础。你可以通过`FileSystem.get()`方法获取一个`FileSystem`实例,...
在压缩包文件"org"中,可能包含了Hadoop相关的源代码或库文件,这些通常是Hadoop项目的组成部分,如`org.apache.hadoop.*`包下的各种类,它们提供了Hadoop的核心功能和接口。通过深入研究这些源代码,开发者可以更好...
API文档中的类和接口,如FileSystem、InputFormat、OutputFormat、Mapper、Reducer等,都是Hadoop编程的关键元素。 三、Hadoop Common API Hadoop Common是所有Hadoop模块的基础,包含网络、I/O、安全、配置等方面...
1. **数据读写**:Flink通过Hadoop的InputFormat和OutputFormat接口,可以读取和写入Hadoop支持的各种数据源,如HDFS、HBase等。这使得Flink可以方便地访问Hadoop生态系统中的存储系统,进行大规模的数据处理。 2. ...
6. **数据输入与输出**:学习如何使用Hadoop的InputFormat和OutputFormat,以及RecordReader和RecordWriter,实现对不同格式数据的读写。 7. **Hadoop安全**:理解Hadoop的安全特性,如Kerberos认证、访问控制列表...
5. **数据输入与输出**:学习如何使用Hadoop的InputFormat和OutputFormat接口自定义数据格式,以及如何使用`hadoop fs`命令操作HDFS。 6. **应用程序开发**:掌握如何编写MapReduce程序,理解Mapper和Reducer的工作...
1. Hadoop的MapReduce编程模型,包括InputFormat、Mapper、Partitioner、Reducer和OutputFormat等组件的作用。 2. Java的IO流和序列化,因为数据需要在网络间传输和持久化。 3. 分布式计算中的数据分区和排序,这...