`

MapReduce高级编程——自定义InputFormat——深入理解

 
阅读更多

0、本文承接上文 MapReduce高级编程——自定义InputFormat

1、环境配置,本文的开发环境请直接参考 基于Eclipse的Hadoop应用开发环境的配置

2、Mapper,Reducer参数解释

 

import java.io.IOException;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;

public class Point3DMapper extends Mapper<Text, Point3D, Text, Point3D>{
	protected void map(Text key, Point3D value, Context context) throws IOException, InterruptedException{
		context.write(key, value);
	}
}

 

   进入Mapper源代码可以看到

 

public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {

  public class Context 
    extends MapContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {
    public Context(Configuration conf, TaskAttemptID taskid,
                   RecordReader<KEYIN,VALUEIN> reader,
                   RecordWriter<KEYOUT,VALUEOUT> writer,
                   OutputCommitter committer,
                   StatusReporter reporter,
                   InputSplit split) throws IOException, InterruptedException {
      super(conf, taskid, reader, writer, committer, reporter, split);
    }
  }
  
  /**
   * Called once at the beginning of the task.
   */
  protected void setup(Context context
                       ) throws IOException, InterruptedException {
    // NOTHING
  }

  /**
   * Called once for each key/value pair in the input split. Most applications
   * should override this, but the default is the identity function.
   */
  @SuppressWarnings("unchecked")
  protected void map(KEYIN key, VALUEIN value, 
                     Context context) throws IOException, InterruptedException {
    context.write((KEYOUT) key, (VALUEOUT) value);
  }
 

 

即,/**

* Text      -> KEYIN
* Point3D  -> VALUEIN
* Text       -> KEYOUT
* Point3D  -> VALUEOUT
**/
Mapper<Text, Point3D, Text, Point3D>

 

而,// Text -> ball etc. -> KEYOUT

// value -> .5, 12.7, 9.0 etc. -> VALUEOUT

context.write(key, value);

 

同理,我们查看Reducer源代码,可以看到,Mapper的KEYOUT类型和VALUEOUT类型,必须对应Reducer的KEYIN类型和VLUEIN类型。

 

public class Reducer<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {

  public class Context 
    extends ReduceContext<KEYIN,VALUEIN,KEYOUT,VALUEOUT> {
    public Context(Configuration conf, TaskAttemptID taskid,
                   RawKeyValueIterator input, 
                   Counter inputKeyCounter,
                   Counter inputValueCounter,
                   RecordWriter<KEYOUT,VALUEOUT> output,
                   OutputCommitter committer,
                   StatusReporter reporter,
                   RawComparator<KEYIN> comparator,
                   Class<KEYIN> keyClass,
                   Class<VALUEIN> valueClass
                   ) throws IOException, InterruptedException {
      super(conf, taskid, input, inputKeyCounter, inputValueCounter,
            output, committer, reporter, 
            comparator, keyClass, valueClass);
    }
  }

  /**
   * Called once at the start of the task.
   */
  protected void setup(Context context
                       ) throws IOException, InterruptedException {
    // NOTHING
  }

  /**
   * This method is called once for each key. Most applications will define
   * their reduce class by overriding this method. The default implementation
   * is an identity function.
   */
  @SuppressWarnings("unchecked")
  protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context
                        ) throws IOException, InterruptedException {
    for(VALUEIN value: values) {
      context.write((KEYOUT) key, (VALUEOUT) value);
    }
  }

 

 

本文的目的是因为有些时候文档不是很清楚,而最好的方法是看源代码。“源码之前,了无秘密”。

 

对于MapReduce的细致执行流程,我推荐看例子经典,博客作者一流的Map Reduce – the Free Lunch is not over?。相信看完会有所收获!

 

 

0
0
分享到:
评论

相关推荐

    Hadoop高级编程- 构建与实现大数据解决方案

    3. **MapReduce编程模型**:深入理解Map函数和Reduce函数的工作原理,以及Combiner和Partitioner的角色。编写Java MapReduce程序,实现自定义Mapper和Reducer类。 4. **YARN资源管理**:了解下一代JobTracker——...

    MapReduce2.0源码分析与实战编程

    5. **源码分析**:理解MapReduce的源码可以帮助开发者深入理解其内部机制,包括作业调度、任务分配、数据通信等。关键类如JobTracker、TaskTracker、Mapper和Reducer的实现,以及Job、InputFormat、OutputFormat等...

    hadoop中文文档

    用户可以通过自定义InputFormat和OutputFormat来处理特定类型的数据。 8. **故障恢复与容错机制**:Hadoop具有内置的故障检测和恢复机制,如心跳检测、数据块的冗余复制等,以确保系统的稳定运行。如果DataNode或...

    hadoop-2.7.6-src

    源码中可以看到各种接口设计,使得开发者可以方便地开发自定义的InputFormat、OutputFormat、Partitioner和Reducer等,以适应不同的数据处理需求。 9. **源码学习方法** 理解Hadoop源码需要具备Java基础、网络知识...

    hadoop-map-reduce-demo

    该项目提供了一个基本的MapReduce应用实例,帮助开发者理解和实践MapReduce编程。核心代码通常包含以下几个部分: 1. **Mapper类**:自定义Mapper类继承自`org.apache.hadoop.mapreduce.Mapper`,并重写`map()`方法...

    hadoop帮助文档

    9. **数据输入与输出**:Hadoop支持多种数据输入和输出格式,如TextInputFormat和TextInputFormat,以及自定义的InputFormat和OutputFormat,允许开发者处理不同类型的文件。 10. **Hadoop应用开发**:学习Hadoop...

    mapreduce-db-operat:mapreduce实现数据从hdfs到mysql之间的相互传递

    1. **MapReduce**:MapReduce由两个主要阶段组成——Map阶段和Reduce阶段。Map阶段将输入数据分割成独立的键值对,并在各个节点上并行处理;Reduce阶段则负责收集Map阶段的结果,进行合并和聚合操作,最终生成所需的...

    hadoop开发所需类

    5. **MapReduce编程模型**:MapReduce包含两个主要阶段——Map和Reduce。Map阶段将输入数据分成键值对并进行处理,Reduce阶段则负责聚合Map阶段的结果。开发者需要定义自己的`Mapper`和`Reducer`类来实现业务逻辑。 ...

    MR-read-Hfile2

    然而,这也要求开发者具备深入理解HBase数据存储结构和MapReduce编程模型的能力。 在实际应用中,需要注意的是,虽然直接读取HFile可以提高效率,但这种方法可能不适合实时查询或更新操作,因为它们缺乏HBase服务层...

Global site tag (gtag.js) - Google Analytics