MapReduce源码分析:Mapper和Reducer类

一:Mapper类

在Hadoop的mapper类中,有4个主要的函数,分别是:setup,clearup,map,run。代码如下:

  1. protected void setup(Context context) throws IOException, InterruptedException {
  2. // NOTHING
  3. }
  4. protected void map(KEYIN key, VALUEIN value,
  5. Context context) throws IOException, InterruptedException {
  6. context.write((KEYOUT) key, (VALUEOUT) value);
  7. }
  8. protected void cleanup(Context context) throws IOException, InterruptedException {
  9. // NOTHING
  10. }
  11. public void run(Context context) throws IOException, InterruptedException {
  12. setup(context);
  13. while (context.nextKeyValue()) {
  14. map(context.getCurrentKey(), context.getCurrentValue(), context);
  15. }
  16. cleanup(context);
  17. }
  18. }

由上面的代码,我们可以了解到,当调用到map时,通常会先执行一个setup函数,最后会执行一个cleanup函数。而默认情况下,这两个函数的内容都是nothing。因此,当map方法不符合应用要求时,可以试着通过增加setup和cleanup的内容来满足应用的需求。

二:Reducer类

在Hadoop的reducer类中,有3个主要的函数,分别是:setup,clearup,reduce。代码如下:

  1. /**
  2. * Called once at the start of the task.
  3. */
  4. protected void setup(Context context
  5. ) throws IOException, InterruptedException {
  6. // NOTHING
  7. }
  1. /**
  2. * This method is called once for each key. Most applications will define
  3. * their reduce class by overriding this method. The default implementation
  4. * is an identity function.
  5. */
  6. @SuppressWarnings("unchecked")
  7. protected void reduce(KEYIN key, Iterable<VALUEIN> values, Context context
  8. ) throws IOException, InterruptedException {
  9. for(VALUEIN value: values) {
  10. context.write((KEYOUT) key, (VALUEOUT) value);
  11. }
  12. }
  1. /**
  2. * Called once at the end of the task.
  3. */
  4. protected void cleanup(Context context
  5. ) throws IOException, InterruptedException {
  6. // NOTHING
  7. }

在用户的应用程序中调用到reducer时,会直接调用reducer里面的run函数,其代码如下:

  1. /*
  2. * control how the reduce task works.
  3. */
  4. @SuppressWarnings("unchecked")
  5. public void run(Context context) throws IOException, InterruptedException {
  6. setup(context);
  7. while (context.nextKey()) {
  8. reduce(context.getCurrentKey(), context.getValues(), context);
  9. // If a back up store is used, reset it
  10. ((ReduceContext.ValueIterator)
  11. (context.getValues().iterator())).resetBackupStore();
  12. }
  13. cleanup(context);
  14. }
  15. }

由上面的代码,我们可以了解到,当调用到reduce时,通常会先执行一个setup函数,最后会执行一个cleanup函数。而默认情况下,这两个函数的内容都是nothing。因此,当reduce不符合应用要求时,可以试着通过增加setup和cleanup的内容来满足应用的需求。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 06:39:01

MapReduce源码分析:Mapper和Reducer类的相关文章

MapReduce源码分析之MapTask分析(二)

SpillThread分析 为什么需要Spill 内存大小总是有效,因此在Mapper在处理过程中,数据持续输出到内存中时,必然需要有机制能将内存中的数据换出,合理的刷出到磁盘上.SpillThread就是用来完成这部分工作. SpillThread的线程处理函数只是做一层封装,当索引表中的kvstart和kvend指向一样的索引位置时,会持续处于等待过程,等待外部通知需要触发spill动作,当有spill请求时,会触发StartSpill来唤醒SpillThread线程,进入到sortAndS

MapReduce源码分析之MapTask分析

前言 MapReduce的源码分析是基于Hadoop1.2.1基础上进行的代码分析. 该章节会分析在MapTask端的详细处理流程以及MapOutputCollector是如何处理map之后的collect输出的数据. map端的主要处理流程 图1 MapTask处理流程 图1所示为MapTask的主要代码执行流程,在MapTask启动后会进入入口run函数,根据是否使用新的api来决定选择运行新的mapper还是旧的mapper,最后完成执行向外汇报. 在这,我们选择分析旧的api,也就是ru

MapReduce源码分析之JobSubmitter(一)

JobSubmitter,顾名思义,它是MapReduce中作业提交者,而实际上JobSubmitter除了构造方法外,对外提供的唯一一个非private成员变量或方法就是submitJobInternal()方法,它是提交Job的内部方法,实现了提交Job的所有业务逻辑.本文,我们将深入研究MapReduce中用于提交Job的组件JobSubmitter. 首先,我们先看下JobSubmitter的类成员变量,如下: // 文件系统FileSystem实例 private FileSystem

MapReduce源码分析之LocatedFileStatusFetcher

LocatedFileStatusFetcher是MapReduce中一个针对给定输入路径数组,使用配置的线程数目来获取数据块位置的实用类.它的主要作用就是利用多线程技术,每个线程对应一个任务,每个任务针对给定输入路径数组Path[],解析出文件状态列表队列BlockingQueue<List<FileStatus>>.其中,输入数据输入路径只不过是一个Path,而输出数据则是文件状态列表队列BlockingQueue<List<FileStatus>>,文

Scrapy源码分析-常用的爬虫类-CrawlSpider(三)

CrawlSpider classscrapy.contrib.spiders.CrawlSpider 爬取一般网站常用的spider.其定义了一些规则(rule)来提供跟进link的方便的机制. 也许该spider并不是完全适合您的特定网站或项目,但其对很多情况都使用. 因此您可以以其为起点,根据需求修改部分方法.当然您也可以实现自己的spider.除了从Spider继承过来的(您必须提供的)属性外,其提供了一个新的属性: rules: Rule对象集合.定义了提取需要跟进url的一些规则.

Spring Developer Tools 源码分析:二、类路径监控

在 Spring Developer Tools 源码分析一中介绍了 devtools 提供的文件监控实现,在第二部分中,我们将会使用第一部分提供的目录监控功能,实现对开发环境中 classpath 的监控. 二.类路径监控 首先看一些这一部分可能涉及到的类图: 在图中,红色斜线左上部分是第一部分中介绍的文件目录监控的类,其中 FileSystemWatcher 会通过独立线程监控指定的目录,当目录内容发生变化时,通过对比快照可以获得所有监控目录变化的文件ChangedFiles,然后将变化通知

MapReduce源码分析总结

转自:http://www.cnblogs.com/forfuture1978/archive/2010/11/19/1882279.html 转者注:本来想在Hadoop学习总结系列详细解析HDFS以及Map-Reduce的,然而查找资料的时候,发现了这篇文章,并且发现caibinbupt已经对Hadoop的源代码已经进行了详细的分析,推荐大家阅读. 转自http://blog.csdn.net/HEYUTAO007/archive/2010/07/10/5725379.aspx 参考: 1

tp5底层源码分析之------tp5.1类的自动加载机制

tp框架作为国内主流框架,目前已经发布了6.0版本,相当于3.*版本是进行了重构,今天我们从源码的角度来研究下tp5.1自动加载的实现 作为单入口框架,从入口文件看起,入口文件在public/下,那么为什么大多数框架要把入口文件放到子文件夹下面呢? 第一,为了动静分离,因为现在的tp框架一般都是单入口,既然是单入口,那么必然要做rewrite,如果把静态文件和程序文件放到一起. 框架路由势必要对每一个请求进行筛选,所以这些框架不约而同的把资源文件和程序文件区分开来,放在了不同的文件夹下面,所以从

MapReduce源码分析之JobSplitWriter

JobSplitWriter被作业客户端用于写分片相关文件,包括分片数据文件job.split和分片元数据信息文件job.splitmetainfo.它有两个静态成员变量,如下: // 分片版本,当前默认为1 private static final int splitVersion = JobSplit.META_SPLIT_VERSION; // 分片文件头部,为UTF-8格式的字符串"SPL"的字节数组"SPL" private static final by