`
king_c
  • 浏览: 223691 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MapReduce的输入输出格式

阅读更多

默认的mapper是IdentityMapper,默认的reducer是IdentityReducer,它们将输入的键和值原封不动地写到输出中。

默认的partitioner是HashPartitinoer,它根据每条记录的键进行哈希操作来分区。

 

输入文件:文件是MapReduce任务的数据的初始存储地。正常情况下,输入文件一般是存在HDFS里。这些文件的格式可以是任意的;我们可以使用基于行的日志文件,也可以使用二进制格式,多行输入记录或其它一些格式。这些文件会很大—数十G或更大。

 

小文件与CombineFileInputFormat

        Hadoop在处理大量小文件时的性能稍微逊色一些,一个原因是FileInputFormat生成的InputSplit总是一个整个或一部分的输入文件。如果文件比较小,并且数量很多,每次map操作的时候只会处理很少的输入数据,但是会有很多map任务,每次新的map操作都回造成一定的性能损失。

        CombineFileInputFormat可以缓解这个问题,它对这种情况做了一定的优化。FileInputFormat将每个文件分割成1个或多个单元,而CombineFileInputFormat可以将多个文件打包到一个输入单元中,这样每次map操作就会有更多的数据来处理。CombineFileInputFormat会考虑到节点和集群的位置信息以决定哪些文件应该打包到一个单元中,所有原本的MapReduce的效率就会下降。


  输入格式:InputFormat类定义了如何分割和读取输入文件,它提供有下面的几个功能:

  • 选择作为输入的文件或对象;
  • 定义把文件划分到任务的InputSplits
  • RecordReader读取文件提供了一个工厂方法;

  Hadoop自带了好几个输入格式。其中有一个抽象类叫FileInputFormat,所有操作文件的InputFormat类都是从它那里继承功能和属性。当开启Hadoop作业时,FileInputFormat会得到一个路径参数,这个路径内包含了所需要处理的文件,FileInputFormat会读取这个文件夹内的所有文件(译注:默认不包括子文件夹内的),然后它会把这些文件拆分成一个或多个的InputSplit。你可以通过JobConf对象的setInputFormat()方法来设定应用到你的作业输入文件上的输入格式。下表给出了一些

标准的输入格式:

输入格式

描述

TextInputFormat

默认格式,读取文件的行

行的字节偏移量

行的内容

KeyValueInputFormat

把行解析为键值对

第一个tab字符前的所有字符

行剩下的内容

SequenceFileInputFormat

Hadoop定义的高性能二进制格式

用户自定义

用户自定义

SequenceFileAsTextInputFormat 是SequenceFileInputFormat的变体,它将键和值转换为Text对象。转换的时候会调用键和值的toString方法。这个格式可以是顺序文件作为流操作的输入。    
SequenceFileAsBinaryInputFormat SequenceFileAsBinaryInputFormat是SequenceFileInputFormat的另一种变体,它将顺序文件的键和值作为二进制对象,它们被封装为BytesWritable对象,因而应用程序可以任意地将这些字节数组解释为他们想要的类型。    
DBInputForma DBInputForma是一个使用JDBC并且从关系数据库中读取数据的一种输入格式。由于它没有任何碎片技术,所以在访问数据库的时候必须非常小心,太多的mapper可能会事数据库受不了。因此DBInputFormat最好在加载小量数据集的时候用。    

4.1MapReduce提供的输入格式

 

  默认的输入格式是TextInputFormat,它把输入文件每一行作为单独的一个记录,但不做解析处理。这对那些没有被格式化的数据或是基于行的记录来说是很有用的,比如日志文件。更有趣的一个输入格式是KeyValueInputFormat,这个格式也是把输入文件每一行作为单独的一个记录。然而不同的是TextInputFormat把整个文件行当做值数据,KeyValueInputFormat则是通过搜寻tab字符来把行拆分为键值对。这在把一个MapReduce的作业输出作为下一个作业的输入时显得特别有用,因为默认输出格式(下面有更详细的描述)正是按KeyValueInputFormat格式输出数据。最后来讲讲SequenceFileInputFormat,它会读取特殊的特定于Hadoop的二进制文件,这些文件包含了很多能让Hadoopmapper快速读取数据的特性。Sequence文件是块压缩的并提供了对几种数据类型(不仅仅是文本类型)直接的序列化与反序列化操作。Squence文件可以作为MapReduce任务的输出数据,并且用它做一个MapReduce作业到另一个作业的中间数据是很高效的。

 

  输入块(InputSplit):一个输入块描述了构成MapReduce程序中单个map任务的一个单元。把一个MapReduce程序应用到一个数据集上,即是指一个作业,会由几个(也可能几百个)任务组成。Map任务可能会读取整个文件,但一般是读取文件的一部分。默认情况下,FileInputFormat及其子类会以64MB(与HDFS的Block默认大小相同,译注:Hadoop建议Split大小与此相同)为基数来拆分文件。你可以在hadoop-site.xml(译注:0.20.*以后是在mapred-default.xml里)文件内设定mapred.min.split.size参数来控制具体划分大小,或者在具体MapReduce作业的JobConf对象中重写这个参数。通过以块形式处理文件,我们可以让多个map任务并行的操作一个文件。如果文件非常大的话,这个特性可以通过并行处理大幅的提升性能。更重要的是,因为多个块(Block)组成的文件可能会分散在集群内的好几个节点上(译注:事实上就是这样),这样就可以把任务调度在不同的节点上;因此所有的单个块都是本地处理的,而不是把数据从一个节点传输到另外一个节点。当然,日志文件可以以明智的块处理方式进行处理,但是有些文件格式不支持块处理方式。针对这种情况,你可以写一个自定义的InputFormat,这样你就可以控制你文件是如何被拆分(或不拆分)成文件块的。自定义的文件格式在第五部分有描述。
  输入格式定义了组成mapping阶段的map任务列表,每一个任务对应一个输入块。接着根据输入文件块所在的物理地址,这些任务会被分派到对应的系统节点上,可能会有多个map任务被分派到同一个节点上。任务分派好后,节点开始运行任务,尝试去最大并行化执行。节点上的最大任务并行数由mapred.tasktracker.map.tasks.maximum参数控制。
  记录读取器(RecordReader):InputSplit定义了如何切分工作,但是没有描述如何去访问它。 RecordReader类则是实际的用来加载数据并把数据转换为适合mapper读取的键值对。RecordReader实例是由输入格式定义的,默认的输入格式,TextInputFormat,提供了一个LineRecordReader,这个类的会把输入文件的每一行作为一个新的值,关联到每一行的键则是该行在文件中的字节偏移量。RecordReader会在输入块上被重复的调用直到整个输入块被处理完毕,每一次调用RecordReader都会调用Mapper的map()方法。
  Mapper:Mapper执行了MapReduce程序第一阶段中有趣的用户定义的工作。给定一个键值对,map()方法会生成一个或多个键值对,这些键值对会被送到Reducer那里。对于整个作业输入部分的每一个map任务(输入块),每一个新的Mapper实例都会在单独的Java进程中被初始化,mapper之间不能进行通信。这就使得每一个map任务的可靠性不受其它map任务的影响,只由本地机器的可靠性来决定。map()方法除了键值对外还会接收额外的两个参数(译注:在0.20.×后的版本,接口已变化,由Context对象代替这两个参数):

  • OutputCollector对象有一个叫collect()的方法,它可以利用该方法把键值对送到作业的reduce阶段。
  • Reporter对象提供当前任务的信息,它的getInputSplit()方法会返回一个描述当前输入块的对象,并且还允许map任务提供关于系统执行进度的额外信息。setStatus()方法允许你生成一个反馈给用户的状态消息,incrCounter()方法允许你递增共享的高性能计数器,除了默认的计数器外,你还可以定义更多的你想要的计数器。每一个mapper都可以递增计数器,JobTracker会收集由不同处理得到的递增数据并把它们聚集在一起以供作业结束后的读取。

  Partition & Shuffle:当第一个map任务完成后,节点可能还要继续执行更多的map任务,但这时候也开始把map任务的中间输出交换到需要它们的reducer那里去,这个移动map输出到reducer的过程叫做shuffle。每一个reduce节点会分派到中间输出的键集合中的一个不同的子集合,这些子集合(被称为“partitions”)是reduce任务的输入数据。每一个map任务生成的键值对可能会隶属于任意的partition,有着相同键的数值总是在一起被reduce,不管它是来自那个mapper的。因此,所有的map节点必须就把不同的中间数据发往何处达成一致。Partitioner类就是用来决定给定键值对的去向,默认的分类器(partitioner)会计算键的哈希值并基于这个结果来把键赋到相应的partition上,自定义的分类器在第五部分有详细描述。
  排序:每一个reduce任务负责归约(reduceing)关联到相同键上的所有数值,每一个节点收到的中间键集合在被送到具体的reducer那里前就已经自动被Hadoop排序过了。
  归约(Reduce):每个reduce任务都会创建一个Reducer实例,这是一个用户自定义代码的实例,负责执行特定作业的第二个重要的阶段。对于每一个已赋予到reducer的partition内的键来说,reducer的reduce()方法只会调用一次,它会接收一个键和关联到键的所有值的一个迭代器,迭代器会以一个未定义的顺序返回关联到同一个键的值。reducer也要接收一个OutputCollector和Report对象,它们像在map()方法中那样被使用。
  输出格式:提供给OutputCollector的键值对会被写到输出文件中,写入的方式由输出格式控制。OutputFormat的功能跟前面描述的InputFormat类很像,Hadoop提供的OutputFormat的实例会把文件写在本地磁盘或HDFS上,它们都是继承自公共的FileInputFormat类。每一个reducer会把结果输出写在公共文件夹中一个单独的文件内,这些文件的命名一般是part-nnnnn,nnnnn是关联到某个reduce任务的partition的id,输出文件夹通过FileOutputFormat.setOutputPath() 来设置。你可以通过具体MapReduce作业的JobConf对象的setOutputFormat()方法来设置具体用到的输出格式。下表给出了已提供的输出格式:

输出格式

描述

TextOutputFormat

默认的输出格式, 以 "key \t value" 的方式输出行

SequenceFileOutputFormat

输出二进制文件,适合于读取为子MapReduce作业的输入

NullOutputFormat

忽略收到的数据,即不做输出 

SequenceFileAsBinaryOutputFormat 与SequenceFileAsBinaryInputFormat相对应,它将键/值对当作二进制数据写入一个顺序文件
MapFileOutputFormat MapFileOutputFormat将结果写入一个MapFile中。MapFile中的键必须是排序的,所以在reducer中必须保证输出的键有序。

表4.2: Hadoop提供的输出格式
  Hadoop提供了一些OutputFormat实例用于写入文件,基本的(默认的)实例是TextOutputFormat,它会以一行一个键值对的方式把数据写入一个文本文件里。这样后面的MapReduce任务就可以通过KeyValueInputFormat类简单的重新读取所需的输入数据了,而且也适合于人的阅读。还有一个更适合于在MapReduce作业间使用的中间格式,那就是SequenceFileOutputFormat,它可以快速的序列化任意的数据类型到文件中,而对应SequenceFileInputFormat则会把文件反序列化为相同的类型并提交为下一个Mapper的输入数据,方式和前一个Reducer的生成方式一样。NullOutputFormat不会生成输出文件并丢弃任何通过OutputCollector传递给它的键值对,如果你在要reduce()方法中显式的写你自己的输出文件并且不想Hadoop框架输出额外的空输出文件,那这个类是很有用的。
  RecordWriter:这个跟InputFormat中通过RecordReader读取单个记录的实现很相似,OutputFormat类是RecordWriter对象的工厂方法,用来把单个的记录写到文件中,就像是OuputFormat直接写入的一样。
  Reducer输出的文件会留在HDFS上供你的其它应用使用,比如另外一个MapReduce作业,或一个给人工检查的单独程序。

转自:http://www.cnblogs.com/spork/
分享到:
评论

相关推荐

    MapReduce类型及格式

    Combine的输入输出键值对类型与Reduce阶段相同,这有助于减少网络传输的数据量和提高性能。 2. Partition:负责将Map输出的键值对分配给对应的Reduce任务。Partitioner决定了Map输出的每个键值对应该传递给哪个...

    MapReduce多路径输入输出

    这是 MapReduce 的多路径输入输出示例代码。有关大数据的相关文章可以阅读我的专栏:《大数据之Hadoop》 http://blog.csdn.net/column/details/bumblebee-hadoop.html

    大数据 80 道面试题及答案.docx

    6. **MapReduce输入输出格式** - 输入数据通常被分割成多个split,每个split对应一个map任务。 - 输出数据默认按字典顺序排序,key+迭代器形式,便于reduce处理。 综上所述,HDFS和MapReduce是大数据处理的关键...

    02.mapreduce数据输入输出类型的序列化问题--明确jobsubmitter.mp4

    02.mapreduce数据输入输出类型的序列化问题--明确jobsubmitter.mp4

    实验项目 MapReduce 编程

    实验项目“MapReduce 编程”旨在让学生深入理解并熟练运用MapReduce编程模型,这是大数据处理领域中的核心技术之一。实验内容涵盖了从启动全分布模式的Hadoop集群到编写、运行和分析MapReduce应用程序的全过程。 ...

    MapReduce输出至hbase共16页.pdf.zip

    3. 实现TableOutputFormat:MapReduce的输出格式默认为文件,但要将结果直接写入HBase,需自定义TableOutputFormat类,使其能够将MapReduce的输出直接转化为HBase的Put操作。 4. 写入HBase:在Reduce阶段,每个...

    基于MapReduce实现决策树算法

    在基于MapReduce实现决策树算法中,MapReduce框架可以对输入数据进行分区和处理,使得决策树算法的计算可以并行进行。 4. 决策树算法在MapReduce中的优化:在基于MapReduce实现决策树算法中,需要对决策树算法进行...

    MapReduce 设计模式

    书中可能还会包含其他更高级的主题,如自定义输入/输出格式、MapReduce工作流以及如何优化MapReduce作业性能等。总的来说,《MapReduce设计模式》是一本实用的参考书,对于希望深入理解和利用MapReduce框架的IT专业...

    大数据实验5实验报告:MapReduce 初级编程实践

    通过Hadoop的`Job`类和相关输入输出格式类,可以设置这些参数并提交作业到Hadoop集群执行。 总结起来,这个实验不仅介绍了MapReduce的基本概念,还展示了如何用Java实现MapReduce任务,以解决实际问题。通过这种...

    MapReduce数据分析实战

    同时,还需要对Hadoop集群的操作和配置有一定了解,例如如何配置输入输出格式,以及如何调优MapReduce作业以提高性能。 在文档中还提到了如何使用LZO压缩格式。LZO是一种用于压缩文件的数据压缩库,可以提高存储...

    MapReduce基础.pdf

    - Reduce阶段的目标是减少输出数据量,通常输出的数据量远小于输入数据量。 #### 三、MapReduce的设计原则 为了确保MapReduce能够在大规模集群上高效运行,其设计遵循以下原则: - **数据不变性**:在MapReduce...

    Hadoop MapReduce多输出详细介绍

    在实践中,开发者还需要考虑如何配置Job和输入输出路径、如何处理配置参数以及如何打包和运行MapReduce作业。对于初学者来说,理解和使用Hadoop MapReduce多输出功能可能具有一定难度,但通过熟悉...

    Hadoop MapReduce Cookbook 源码

    3. **数据输入与输出**:探讨InputFormat和OutputFormat接口,理解如何自定义输入输出格式以适应不同类型的数据源。 4. **错误处理与容错机制**:讲解Hadoop的检查点、重试和故障恢复策略,以确保任务的可靠性。 5...

    Hadoop mapreduce实现wordcount

    它首先将输入文本分割成单词,然后对每个单词进行计数,最后输出每个单词及其对应的数量。 3. **Map 阶段**: 在 Map 阶段,输入数据被分割成多个块(Block),每个块会分配到集群中的一个节点上进行处理。Mapper ...

    【MapReduce篇04】MapReduce之OutputFormat数据输出1

    在Hadoop MapReduce框架中,OutputFormat扮演着至关重要的角色,它是定义如何将Mapper和Reducer产生的中间结果转化为最终输出格式的规范。MapReduce之OutputFormat数据输出主要涉及到以下几个方面: 1. **...

    MapReduce研究现状 .zip

    5. **输入输出格式优化**:选择合适的输入输出格式,如SequenceFile或TextOutputFormat,可以提高读写效率。 6. **内存管理**:合理设置Java堆大小,避免因内存溢出导致的任务失败。 对于Hadoop的问题,常见的挑战...

    基于MapReduce的Apriori算法代码

    3. Mapper和Reducer:Mapper和Reducer是MapReduce框架中的两个主要组件,Mapper负责将输入数据集映射成键值对,Reducer负责聚合Mapper输出的键值对。 4. 并行计算:该代码使用MapReduce框架来实现Apriori算法的并行...

    MapReduce2.0程序设计多语言编程(理论+实践)

    此外,还有Partitioner用于控制数据分发,Combiner用于本地聚合,以及InputFormat和OutputFormat用于定义输入和输出格式。 3. **Java编程**:Java是MapReduce的原生语言,使用Hadoop的API可以直接创建MapReduce程序...

Global site tag (gtag.js) - Google Analytics