1 什么是MapReduce?

  Map本意可以理解为地图,映射(面向对象语言都有Map集合),这里我们可以理解为从现实世界获得或产生映射。Reduce本意是减少的意思,这里我们可以理解为归并前面Map产生的映射。

2 MapReduce的编程模型

  按照google的MapReduce论文所说的,MapReduce的编程模型的原理是:利用一个输入key/value对集合来产生一个输出的key/value对集合。MapReduce库的用户用两个函数表达这个计算:Map和Reduce。用户自定义的Map函数接受一个输入的key/value对值,然后产生一个中间key/value对值的集合。MapReduce库把所有具有相同中间key值的中间value值集合在一起后传递给Reduce函数。用户自定义的Reduce函数接受一个中间key的值和相关的一个value值的集合。Reduce函数合并这些value值,形成一个较小的value值的集合。

3 MapReduce实现

  通过将Map调用的输入数据自动分割为M个数据片段的集合,Map调用被分布到多台机器上执行。输入的数据片段能够在不同的机器上并行处理。使用分区函数将Map调用产生的中间key值分成R个不同分区(例如,hash(key) mod R),Reduce调用也被分布到多台机器上执行。分区数量(R)和分区函数由用户来指定。

  MapReduce实现的大概过程如下:

  1.用户程序首先调用的MapReduce库将输入文件分成M个数据片度,每个数据片段的大小一般从16MB到64MB(可以通过可选的参数来控制每个数据片段的大小)。然后用户程序在集群中创建大量的程序副本。

  2.这些程序副本中的有一个特殊的程序master。副本中其它的程序都是worker程序,由master分配任务。有M个Map任务和R个Reduce任务将被分配,master将一个Map任务或Reduce任务分配给一个空闲的worker。

  3.被分配了map任务的worker程序读取相关的输入数据片段,从输入的数据片段中解析出key/value对,然后把key/value对传递给用户自定义的Map函数,由Map函数生成并输出的中间key/value对,并缓存在内存中。

  4.缓存中的key/value对通过分区函数分成R个区域,之后周期性的写入到本地磁盘上,会产生R个临时文件。缓存的key/value对在本地磁盘上的存储位置将被回传给master,由master负责把这些存储位置再传送给Reduce worker。

  5.当Reduce worker程序接收到master程序发来的数据存储位置信息后,使用RPC从Map worker所在主机的磁盘上读取这些缓存数据。当Reduce worker读取了所有的中间数据(这个时候所有的Map任务都执行完了)后,通过对key进行排序后使得具有相同key值的数据聚合在一起。由于许多不同的key值会映射到相同的Reduce任务上,因此必须进行排序。如果中间数据太大无法在内存中完成排序,那么就要在外部进行排序。

  6.Reduce worker程序遍历排序后的中间数据,对于每一个唯一的中间key值,Reduce worker程序将这个key值和它相关的中间value值的集合(这个集合是由Reduce worker产生的,它存放的是同一个key对应的value值)传递给用户自定义的Reduce函数。Reduce函数的输出被追加到所属分区的输出文件。

  上面过程中的排序很容易理解,关键是分区,这一步最终决定该键值对未来会交给哪个reduce任务,如统计单词出现的次数可以用前面说的hash(key) mod R来分区,如果是对数据进行排序则应该根据key的分布进行分区。

图1 MapReduce过程

4 例子

  假设我们需要处理一批有关天气的数据,其格式如下: 按照ASCII码存储,每行一条记录,每一行字符从0开始计数,第15个到第18个字符为年,第25个到第29个字符为温度,其中第25位是符号+/-,现在需要统计出每年的最高温度。

  0067011990999991950051507+0000+ 
  0043011990999991950051512+0022+ 
  0043011990999991950051518-0011+ 
  0043012650999991949032412+0111+ 
  0043012650999991949032418+0078+ 
  0067011990999991937051507+0001+ 
  0043011990999991937051512-0002+ 
  0043011990999991945051518+0001+ 
  0043012650999991945032412+0002+ 
  0043012650999991945032418+0078+

  MapReduce主要包括两个步骤:Map和Reduce 每一步都有key/value对作为输入和输出:

  Map阶段的key/value对的格式是由输入的格式所决定的,如果是默认的TextInputFormat,则每行作为一个记录进程处理,其中key为此行的开头相对于文件的起始位置,value就是此行的字符文本,Map阶段的输出的key/value对的格式必须同Reduce阶段的输入key/value对的格式相对应

  对于上面的例子,在map过程,输入的key-value对如下: 
  (0 ,0067011990999991950051507+0000+) 
  (1 ,0043011990999991950051512+0022+) 
  (2 ,0043011990999991950051518-0011+) 
  (3 ,0043012650999991949032412+0111+) 
  (4 ,0043012650999991949032418+0078+) 
  (5 ,0067011990999991937051507+0001+) 
  (6 ,0043011990999991937051512-0002+) 
  (7 ,0043011990999991945051518+0001+) 
  (8 ,0043012650999991945032412+0002+) 
  (9 ,0043012650999991945032418+0078+)

  将上面的数据作为用户编写的map函数的输入,通过对每一行字符串的解析,得到年/温度的key/value对作为输出: 
  (1950, 0) 
  (1950, 22) 
  (1950, -11) 
  (1949, 111) 
  (1949, 78) 
  (1937, 1) 
  (1937, -2) 
  (1945, 1) 
  (1945, 2) 
  (1945, 78)

  在Reduce过程,将map过程中的输出,按照相同的key将value放到同一个列表中作为用户写的reduce函数的输入 
  (1950, [0, 22, –11]) 
  (1949, [111, 78]) 
  (1937, [1, -2]) 
  (1945, [1, 2, 78])

  在Reduce过程中,在列表中选择出最大的温度,将年/最大温度的key/value作为输出: 
  (1950, 22) 
  (1949, 111) 
  (1937, 1) 
  (1945, 78)

  其逻辑过程可用如下图表示:

参考:

http://desert3.iteye.com/blog/865243

http://www.cnblogs.com/duguguiyu/archive/2009/02/28/1400278.html

http://www.cnblogs.com/MitiskySean/p/3320451.html

<<MapReduce: Simplied Data Processing on Large Clusters>>

MapReduce的理解的更多相关文章

  1. Hadoop 对MapReduce的理解

    对MapReduce的理解 客户端启动一个作业 向JobTraker请求一个JobId 将资源文件复制到HDFS上,包括Jar文件,配置文件,输入划分信息等 接收作业后,进入作业队列,根据输入划分信息 ...

  2. Hadoop学习笔记—MapReduce的理解

    我不喜欢照搬书上的东西,我觉得那样写个blog没多大意义,不如直接把那本书那一页告诉大家,来得省事.我喜欢将我自己的理解.所以我会说说我对于Hadoop对大量数据进行处理的理解.如果有理解不对欢迎批评 ...

  3. 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制

    今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...

  4. MapReduce深入理解输入和输出格式(2)-输入和输出完全总结

    MapReduce太高深,性能也值得考虑,大家感兴趣的还是看看spark比较好. FileInputFormat类 FileInputFormat是所有使用文件为数据源的InputFormat实现的基 ...

  5. MapReduce深入理解输入和输出格式(1)-输入分片与记录

    一个输入分片( in put split)就是能够被单个map 操作 处理的输入块. 每一个map 操作只处理一个输入分片,并且一个一个地处理每条记录,也就是一个键/值对.输入分片和记录都是逻辑上的, ...

  6. 漫画揭秘Hadoop MapReduce | 轻松理解大数据

    网址:http://www.iqiyi.com/w_19rtz04nh9.html

  7. hadoop研究:mapreduce研究前的准备工作

    继续研究hadoop,有童鞋问我,为啥不接着写hive的文章了,原因主要是时间不够,我对hive的研究基本结束,现在主要是hdfs和mapreduce,能写文章的时间也不多,只有周末才有时间写文章,所 ...

  8. Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

    前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...

  9. MapReduce 原理与 Python 实践

    MapReduce 原理与 Python 实践 1. MapReduce 原理 以下是个人在MongoDB和Redis实际应用中总结的Map-Reduce的理解 Hadoop 的 MapReduce ...

随机推荐

  1. CSS预处理框架:less,scss

    CSS预处理器:less和sass:CSS 预处理器是一种语言用来为 CSS 增加一些编程的的特性,无需考虑浏览器的兼容性问题,例如你可以在 CSS 中使用 变量.简单的程序逻辑.函数等等在编程语言中 ...

  2. 初识CoreData与详解

    Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...

  3. 【转】Polya定理

    转自:http://endlesscount.blog.163.com/blog/static/82119787201221324524202/ Polya定理 首先记Sn为有前n个正整数组成的集合, ...

  4. 利用canvas图片剪切

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <met ...

  5. laravel 生成验证码的方法

    在Laravel中有很多图片验证码的库可以使用,本篇介绍其中之一:gregwar/captcha,这个库比较简单,在Laravel中比较常用.下面我们就来介绍下使用细节: 首先, composer.j ...

  6. Linux下如何自己编译源代码(制作成可以安装的.deb文件)

    以tree实用程序(以树型结构获取目录树)为例,介绍Ubuntu中如何管理源码包,包括查询,获取,编译源码包,直至安装.   1) 在获取源码包之前,确保在软件源配置文件/etc/apt/source ...

  7. HTML5- Canvas入门(三)

    前两章我们掌握了线段.矩形和多边形的绘制方法,今天我们主要是学习如何绘制圆弧和贝塞尔曲线. 圆弧的绘制 圆弧可以理解为一个圆上的某部分线段,在canvas中,绘制一条圆弧的语法如下: ctx.arc( ...

  8. nodejs事件轮询详述

    目录 概述 nodejs特点 事件轮询 关于异步方法 概述 关于nodejs的介绍网上资料非常多,最近由于在整理一些函数式编程的资料时,多次遇到nodejs有关的内容.所以就打算专门写一篇文章总结一下 ...

  9. 60分钟Python快速学习(给发哥一个交代)

    60分钟Python快速学习 之前和同事谈到Python,每次下班后跑步都是在听他说,例如Python属于“胶水语言啦”,属于“解释型语言啦!”,是“面向对象的语言啦!”,另外没有数据类型,逻辑全靠空 ...

  10. spring快速入门(三)

    一.在spring快速入门(二)的基础上,原先我们是采用构造方法完成对象的注入.这里还有其他的方法可以完成注入,通过set方法来完成. 修改UserActionImpl package com.mur ...