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
结合Hadoop源码,详细讲解了MapReduce开发中的InputFormat,很详细。
3.1.2 编程读写HDFS 3.2 剖析MapReduce 程序 3.2.1 Hadoop数据类型 3.2.2 Mapper 3.2.3 Reducer 3.2.4 Partitioner:重定向Mapper输出 3.2.5 Combiner:本地reduce 3.2.6 预定义mapper和Reducer类的单词计数...
Apache Hive 的 InputFormat,在查询 SequenceFiles 时将返回 (Text) 键和 (Text) 值。 我需要在不拆分内容的情况下完整解析大量文本文件。 HDFS 在处理大型连续文件时提供最佳吞吐量,因此我使用 Apache Mahout 将...
映射文件输入格式MapFiles 的 Hadoop InputFormat,它在将任何内容传递给映射器之前过滤不相关的 FileSplits。目的假设您的文件系统中有一些带有排序键的非常大的文件,并且键已排序。 在编写 MapReduce 作业时,您...
自定义MapReduce的InputFormat,实现提取指定开始与结束限定符的内容。
413.2.5 Combiner:本地reduce 433.2.6 预定义mapper和Reducer类的单词计数 433.3 读和写 433.3.1 InputFormat 443.3.2 OutputFormat 493.4 小结 50第二部分 实战第4章 编写MapReduce基础程序 524.1...
有前三章的内容前言第一部分 基础篇第1章 阅读源代码前的准备1.1 准备源代码学习环境1.1.1 基础软件下载1.1.2 如何准备Windows环境1.1.3 如何准备Linux环境1.2 获取Hadoop源代码1.3 搭建Hadoop源代码阅读...
维基百科-Hadoop 维基百科输入格式和一些有用的维基百科 Hadoop 工具。用法首先,您必须将WikiInputFormat设置为您的作业 InputFormat: job . setInputFormatClass( WikiInputFormat . class); 您的 Mappers 传入 ...
Hadoop组件3.1 HDFS 文件操作3.1.1 基本文件命令3.1.2 编程读写HDFS3.2 剖析MapReduce 程序3.2.1 Hadoop数据类型3.2.2 Mapper3.2.3 Reducer3.2.4 Partitioner:重定向Mapper输出3.2.5 Combiner:本地reduce3.2.6 ...
71.5.2 相同程序在MapReduce中的扩展 91.6 用Hadoop统计单词——运行第一个程序 111.7 Hadoop历史 151.8 小结 161.9 资源 16第2章 初识Hadoop 172.1 Hadoop的构造模块 172.1.1 NameNode 172.1.2 DataNode 182.1.3 ...
编译环境:centos 6.4 64bit、maven 3.3.9、jdk1.7.0_79、lzo-2.09;...解决:hive报错:Cannot create an instance of InputFormat class org.apache.hadoop ....... as specified in mapredwork!
自定义inputFormat&&outputFormat1
从 Couchbase 中提取键/值的实际 InputFormat 存在于 Sqoop 连接器的基于代码中,但对 API 的客户端部分是隐藏的。 取而代之的是将 Sqoop 暴露出来,这为许多希望在 map/reduce 作业中直接处理来自 Couchbase 的键/...
上个月InfoQ展示了怎样在第一个步骤中,使用InputFormat类来更好地对接收输入文件进行控制。而在本文中,我们将同大家一起探讨怎样自定义最后一个步骤——即怎样写入输出文件。OutputFormat将Map/Reduce作业的输出...
它可以通过YARN或Spark的Standalone在Hadoop集群中运行,并且可以处理HDFS、Hbase、Cassandra、Hive和任何Hadoop InputFormat中的数据。它旨在执行批处理(类似于MapReduce)和提供新的工作特性,例如流计算,SparkSQL...
ExcelRecordReaderMapReducehadoop ... 不支持Zip文件执行任务为> hadoop jar ExcelRecordReaderMapReduce-0.0.1-SNAPSHOT-jar-with-dependencies.jar出来作业完成后,您可以检查HDFS中输出目录的内容。 hadoop fs
合并文件InputFormat演示我的演示项目。安装下载项目并运行命令: mvn package 编译的jar是target/CombineFileDemo-0.0.1-SNAPSHOT.jar 。用法hadoop jar CombineFileDemo-0.0.1-SNAPSHOT.jar TestMain <src> 执照...