`
flyingdutchman
  • 浏览: 358442 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hadoop深入学习:OutputFormat组件

阅读更多
         在本节中,我们着重来学习一下MapReduce编程框架中的OutputFormat组件。
         在MapReduce中,OutputFormat主要用于描述经reducer处理后输出的数据的格式,它会将用户提供的key/value键值对而写入到特定格式的文件中。
       
         我们先看一下在1.0老版本中的OutputFormat接口的代码:
public interface OutputFormat<K, V> {

  /** 
   * 返回一个RercordWriter类的对象,并有该对象接收用户的key/value数据对儿,然后
   * 按指定的格式将数据写入文件
   *
   * @param ignored
   * @param job configuration for the job whose output is being written.
   * @param name the unique name for this part of the output.
   * @param progress mechanism for reporting progress while writing to file.
   * @return a {@link RecordWriter} to write the output for the job.
   * @throws IOException
   */
  RecordWriter<K, V> getRecordWriter(FileSystem ignored, JobConf job,
                           String name, Progressable progress)throws IOException;

  /** 
   * 该方法一般用在用户作业被提交到JobTracker之前,由JobClient自动调用该接口来检查
   *  数据目录是否合法
   *  
   * <p>This is to validate the output specification for the job when it is
   * a job is submitted.  Typically checks that it does not already exist,
   * throwing an exception when it already exists, so that output is not
   * overwritten.</p>
   *
   * @param ignored
   * @param job job configuration.
   * @throws IOException when output should not be attempted
   */
  void checkOutputSpecs(FileSystem ignored, JobConf job) throws IOException;
}

         
         Hadoop自带了很多的OutputFormat的实现,它们与InputFormat实现县对应。这里我们就着重学习所有基于文件的OutputFormat的实现基类FileOutputFormat类。
         FileOutputFormat有两个最主要的功能:
         1)、实现checkOutputSpecs()方法,该方法是在作业运行之前被调用的,默认会检查用户的输出目录是否存在,如果存在则爆出异常,防止该输出目录中已有数据被覆盖。
         2)、处理side-effect file,该文件并不是任务的最在中输出文件,而是具有特殊用途的专属文件,其典型应用是执行推测式任务。

              在Hadoop中,有硬件或软件再或数据的原因,一个作业的某些子任务可能会慢于其他同类型的子任务,这些“慢子任务”明显会拖慢整个作业的执行进度,因此hadoop对这些慢任务实行推测式执行,即在另外一个节点上启动一个和慢子任务相同的任务——该任务就是推测式任务,最先完成的任务的计算结果后就被认为是这个数据块最终的处理结果,然后系统会杀死还没执行完的慢子任务。
              为了防止两个相同的子任务同时往一个输出文件中写入数据而发生冲突,FileOutputFormat会为每一个Reduce Task的输出数据创建一个side-effect file文件,并将产生的数据临时写入该文件,然后带Reduce Task完成后,在将之移动到最终的输出目录。默认情况下,当MapReduce作业完成后,会在最终的结果目录${mapred.out.dir}下生成一个空的_SUCCESS文件,该文件主要作为一个作业完成的标志。如果使用Oozie,那么Oozie就是通过最终结果目录下的_SUCCESS文件的存在来判断作业是否执行完成的。

          上述过程都是由一个叫OutputCommiter的接口实现的,Hadoop提供了默认的该接口的实现类FileOutputCommiter,当然开发者也可以根据需求来编写自己的OutputCommiter实现类,并通过${mapred.output.commiter.class}指定,下面是接口中的方法及FileOutputCommiter中的实现:                                                                       
     方法            何时使用            FileOutputCommiter中的实现  
setupJob      作业初始化           创建临时目录${mapred.out.dir}_temorary
commitJob     作业成功完成         删除临时目录,并在${mapred.out.dir}下创建空_SUCCESS文件
abortJob      作业运行失败         删除临时目录
setupTask     任务初始化           不进行任何操作
needsTaskCommit判断是否要提交结果  只要存在side-effect file,就返回true
commitTask    任务运行完成         提交结果,将side-effect file移到${mapred.out.dir}目录下
abortTask     任务允许失败         删除任务的side-effect file


         对于1.0的新版本,除了将接口变成抽象类外,还添加了一个getOutputCommitter()方法:代码如下:
public abstract class OutputFormat<K, V> {

  /** 
   * 返回一个RercordWriter类的对象,并有该对象接收用户的key/value数据对儿,然后
   * 按指定的格式将数据写入文件
   *
   * @param context the information about the current task.
   * @return a {@link RecordWriter} to write the output for the job.
   * @throws IOException
   */
  public abstract RecordWriter<K, V> 
    getRecordWriter(TaskAttemptContext context
                    ) throws IOException, InterruptedException;

  /** 
   * 作业提交前由JobClient调用来检查输出目录是否存在,存在就报异常放在数据覆盖
   *  
   * <p>This is to validate the output specification for the job when it is
   * a job is submitted.  Typically checks that it does not already exist,
   * throwing an exception when it already exists, so that output is not
   * overwritten.</p>
   *
   * @param context information about the job
   * @throws IOException when output should not be attempted
   */
  public abstract void checkOutputSpecs(JobContext context
                                        ) throws IOException, 
                                                 InterruptedException;

  /**
   * Get the output committer for this output format. This is responsible
   * for ensuring the output is committed correctly.
   * @param context the task context
   * @return an output committer
   * @throws IOException
   * @throws InterruptedException
   */
  public abstract OutputCommitter getOutputCommitter(TaskAttemptContext context
                                     ) throws IOException, InterruptedException;
}
        
分享到:
评论

相关推荐

    hadoop 文档:Hadoop开发者下载

    4. **Hadoop API**:学习使用Hadoop API进行数据读写和处理,例如FileSystem API用于文件操作,InputFormat和OutputFormat定义输入输出格式,Mapper和Reducer实现数据处理逻辑。 5. **MapReduce编程**:理解...

    hadoop 开发者入门专刊 1-4

    《Hadoop开发者入门专刊1-4》是一套专为Hadoop初学者设计的教程,旨在帮助读者快速掌握Hadoop开发的基本技能...通过阅读和实践,读者将能够掌握Hadoop的基本操作和开发技巧,为进一步深入学习大数据技术打下坚实基础。

    Hadoop: The Definitive Guide 中英两版

    这本书由Tom White撰写,全面深入地介绍了Hadoop的各个组件及其工作原理,对于初学者和专业人士来说都是一份宝贵的参考资料。 Hadoop是分布式计算领域的开源框架,主要用于处理和存储大量数据。它的核心包括两个...

    最新Hadoop学习笔记

    本笔记将从环境搭建、HDFS配置、YARN配置、分布式配置到MapReduce编程,全方位介绍Hadoop的学习过程,并结合JavaWeb项目实践,帮助读者深入理解Hadoop的工作原理和应用。 ### 一、环境搭建 在开始Hadoop的学习之前...

    Hadoop-Project:我为CS516数据密集型计算系统做的Hadoop项目合集

    - 使用Java编写Hadoop作业,开发者可以利用Hadoop的InputFormat和OutputFormat接口来定义输入和输出格式,以及RecordReader和RecordWriter来读写数据。 3. **Hadoop项目实践**: - 在这个项目合集中,你可能已经...

    《Hadoop开发者》

    - 分布式存储:深入学习HDFS的工作原理,包括数据块、副本策略、故障恢复机制。 - 分布式计算:了解MapReduce编程模型,包括Mapper和Reducer阶段,以及 Shuffle和Sort过程。 2. Hadoop开发实践: - Hadoop开发...

    hadoop source code归档

    通过研究Hadoop的源代码,开发者和数据工程师可以深入学习其内部机制,优化性能,甚至开发新的功能。 首先,我们来了解一下Hadoop的核心组件: 1. **HDFS(Hadoop Distributed File System)**:HDFS是Hadoop的...

    hadoop2.7.3源码包,hadoop2.7.3zip源码包

    总之,Hadoop 2.7.3源码包是一个宝贵的资源,对于想要深入了解Hadoop工作原理、进行二次开发或性能优化的开发者来说,它是必不可少的学习资料。通过这个源码包,你可以探索Hadoop如何处理大数据,学习分布式系统的...

    Hadoop-Programs:Hadoop-MapReduce

    在2015年的夏季,通过对《Hadoop权威指南》的深入学习,我们可以理解MapReduce的基本工作原理及其编程模型。 **MapReduce的基本概念** 1. **Map阶段**: 在Map阶段,输入数据被分割成多个块,并在集群中的多台机器...

    hadoop应用开发技术详解代码

    本书“Hadoop应用开发技术详解”的源代码涵盖了第3、4、5、7、8、10、11和12章的内容,为读者提供了丰富的实践示例,帮助理解并应用Hadoop生态系统中的关键组件。以下是对这些章节涉及知识点的详细解释: 1. **...

    hadoop 2.5.2 源码

    总结来说,Hadoop 2.5.2源码提供了一个深入学习和研究分布式计算的机会。通过分析源码,开发者不仅能理解Hadoop的内部工作机制,还能根据实际需求进行定制和优化,提升大数据处理的效率和可靠性。无论是对Hadoop感...

    Hadoop开发者入门-带书签文字版

    1. **Hadoop生态系统**:了解Hadoop不仅仅是学习Hadoop本身,还需要熟悉与其相关的组件,如HDFS(Hadoop Distributed File System)用于分布式存储,MapReduce用于分布式计算,YARN(Yet Another Resource ...

    hadoop-course:从 code.google.comphadoop-course 自动导出

    对于初学者,建议先了解分布式系统的基本概念,然后深入学习HDFS和MapReduce的工作原理。接下来,通过编写简单的MapReduce程序,熟悉Hadoop编程。最后,尝试解决实际问题,例如数据清洗、分析或预测,以巩固所学知识...

    实战hadoop中的源码

    深入学习Hadoop源码,我们可以探讨以下几个关键知识点: 1. **Hadoop架构**:理解Hadoop的分布式文件系统(HDFS)和MapReduce计算模型,以及YARN资源调度器的工作原理。 2. **HDFS**:研究HDFS的数据块、副本策略...

    hadoop中文版API.zip

    Hadoop中文版API是针对Apache Hadoop开源框架的中文文档,它为...通过深入学习和实践Hadoop中文版API,开发者能够更有效地开发和优化大数据处理程序,充分利用Hadoop平台的潜力,处理海量数据并实现高效的数据分析。

    hadoop-API.zip_Hadoop学习_hadoop api

    这个“hadoop-API.zip”压缩包包含了Hadoop的中文版API文档,对于正在学习Hadoop或者需要深入理解Hadoop API的开发者来说,是一份非常有价值的资源。 Hadoop主要由两个组件构成:HDFS(Hadoop Distributed File ...

    Hadoop Real-World Solutions Cookbook 源代码

    5. **Chap 6 - 数据分析与挖掘**:此章节可能深入到使用Hadoop进行数据分析和挖掘,包括使用Mahout库进行机器学习,或者使用Spark进行实时流处理。 6. **Chap 7 - 高级MapReduce技术**:涵盖如使用Secondary Sort...

    Hadoop技术内幕 深入解析HADOOP COMMON和HDFS架构设计与实现原理

    《Hadoop技术内幕:深入解析HADOOP COMMON和HDFS架构设计与实现原理》这本书是IT领域的经典之作,...通过深入学习这两部分内容,不仅可以提升大数据处理的效率,还能有效地解决可能出现的问题,确保数据的安全和稳定。

    Hadoop-0.20.1+API

    Hadoop是Apache软件基金会开源的一个分布式计算框架,主要由两个核心组件构成:HDFS(Hadoop Distributed File System)和MapReduce。HDFS提供了高容错性的分布式存储,而MapReduce则为大规模数据处理提供了并行计算...

    hadoop api 帮助文档

    1. Hadoop的核心组件: - HDFS(Hadoop Distributed File System):分布式文件系统,提供高容错性、高可用性的数据存储。 - MapReduce:分布式计算模型,用于处理和生成大规模数据集。 2. Hadoop API 主要模块:...

Global site tag (gtag.js) - Google Analytics