http://www.nowamagic.net/librarys/veda/detail/1768

上一篇 大规模分布式数据处理平台Hadoop的介绍 中提到了Google的分布式计算模型Map Reduce,这里再单独拿出来了解一下。

并行计算简介

计算机的早期阶段,程序都是serial(连续的),类似于批处理程序。

并行计算的程序中,进程将一个任务分割成多个部分parts,每个“部分“都是能够并行处理的,每个“部分”可以同时运行在不同的cpu上,这些cpus可以是同一台机器上,也可以是通过网络运行在不同机器的cpu上。

如果一个程序想要通过并行来实现,第一步的工作是需要将待处理的工作分割成一系列的任务task,并且这些任务是能够并行的运行在处理器上,当然一些情况下,待处理的工作是没有办法分割成这样的一些列的任务的,例如对于计算Fibonacci这个工作:

Fk+2 = Fk + Fk+1

该工作是不能被分割为这样的一系列的任务的,因为每个计算的值是需要依赖上次计算的结果的。

下面给出一个能够被“并行”的例子:

如果有大量的数据需要被处理,如果这些数据能够被分割为等大小的小块(partitions)。更加具体话的说,对于下面的数组:

如果我们需要对于上面数组的每个元素都进行处理,并且每个计算是相对独立的话,任务之间不需要交互,这是一个使用master/worker的基本实现:

Master:

  1. 初始化该数组,并且将该数组分割成各个部分subarray
  2. 将每个subarray发送到各个worker
  3. 如果各个worker完成了对于数组元素的计算的话,master将接受各个worker的计算结果

Worker:

  1. 接受subarray
  2. 处理该subarray
  3. 将计算结构传递给master

什么是MapReduce?

在lisp语言中,map作为一个输入函数接受一个序列,然后处理每个序列中value值,然后reduce将最终的map计算出来的结果整理成最终程序输出。这就是MapReduce最初的思想来源,通过用户定义的map函数将输入分割成key/value对,然后处理该数据,最终通过Reduce函数将处理完成的记过合并。

下面是一个简单的示例程序:

map(String key, String value):
// key: document name
// value: document contents
for each word w in value:
EmitIntermediate(w, "1");
reduce(String key, Iterator values):
// key: a word
// values: a list of counts
int result = 0;
for each v in values:
result += ParseInt(v);
Emit(AsString(result));

MapReduce是如何运行的?

Map/Reduce模型计算示意图

1. MapReduce Library首先将输入文件切割成多个小片的文件pieces,然后MapReduce Library将启动复制操作,将用户程序复制到各个a cluster of machines上。

2. 在这些a cluster of machines中,其中一个比较特殊称之为master,其他的machine被称之为worker,master选择空闲的worker并将任务(map任务或者是reduce任务)分配给这些空闲的worker任务。

3. 一个worker如果被master分配了map任务的话,该worker首先读取该key/value对,然后执行用户定义的map函数,这些处理完成的key/value对被缓存到内存中。

4. 然后,将这些key/value对写入本地磁盘,然后worker通知master。

5. 如果master接收到了worker在第4步的通知之后,master将这个信息传递给reduce worker,该reduce worker通过远程系统调用的形式读取该worker磁盘上存储的处理完的数据。

如果reduce worker读取完了所有的数据的话,然后该reduce worker将读取到的数据排序,如果数据量比较大的话,无法全部放在内存中,那么排序将使用外部排序来实现。

6. Reduce worker遍历已排序的数据,然后将数据传递到用户定义的Reduce函数。

7. 当所有的map和reduce完成之后,然后master唤醒用户程序。

通过整个程序的运行过程,我们可以看出用户程序仅仅需要编写Map函数和Reduce函数即可,MapReduce库首先通过调用用户自定义的Map函数,将输入文件分割,如果数据处理完成,将调用Reduce函数将结果合并起来。

Google的分布式计算模型Map Reduce map函数将输入分割成key/value对的更多相关文章

  1. python 函数式编程:高阶函数,map/reduce

    python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...

  2. map/reduce/filter/lambda

    Python内建了map()/reduce()/filter()函数. map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的It ...

  3. Python函数式编程,map/reduce,filter和sorted

    什么是函数式编程? 与面向对象编程(Object-oriented programming)和过程式编程(Procedural programming)并列的编程范式. 最主要的特征是,函数是第一等公 ...

  4. Hadoop Map/Reduce教程

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html 目的 先决条件 概述 输入与输出 例子:WordCount v1.0 ...

  5. 一步一步跟我学习hadoop(5)----hadoop Map/Reduce教程(2)

    Map/Reduce用户界面 本节为用户採用框架要面对的各个环节提供了具体的描写叙述,旨在与帮助用户对实现.配置和调优进行具体的设置.然而,开发时候还是要相应着API进行相关操作. 首先我们须要了解M ...

  6. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  7. (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)

    原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...

  8. 高阶函数:map()/reduce()

    Python内建了map()和reduce()函数. 如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clus ...

  9. python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))

    1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...

随机推荐

  1. 深度理解STL之map、set

    课程设计做了这个一直没有整理(搬运 set算是关键字和相同的特殊map set应该更加被强调理解为“集合”,而集合所涉及的操作并.交.差等,即STL提供的如交集set_intersection().并 ...

  2. Kafka单机配置部署

    摘要:上节 学习了Kafka的理论知识,这里安装单机版以便后续的测试. 首先安装jdk 一.单机部署zk 1.1安装: tar -zxf zookeeper-3.4.10.tar.gz -C /opt ...

  3. 洛谷P3625 - [APIO2009]采油区域

    Portal Description 给出一个\(n\times m(n,m\leq1500)\)的矩阵,从中选出\(3\)个互不相交的\(k\times k\)方阵,使得被选出的数的和最大. Sol ...

  4. 刷题总结——松鼠的新家(bzoj3631)

    题目: Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上. ...

  5. Echarts学习总结(一)-----柱状图

    简介 ECharts,缩写来自Enterprise Charts,商业级数据图表,基于[HTML5]Canvas (ZRender),纯Javascript图表库,是百度的一个开源的数据可视化工具,业 ...

  6. centos7配置国内yum源

    文章目录 1.什么是yum仓库? 2.yum仓库配置 2.1.阿里镜像仓库配置 2.1.1.配置步骤 2.1.2.epel源 安装和配置 2.1.3.查看yum源 2.2.配置 清华大学镜像仓库 1. ...

  7. javaweb学习总结(十八)——JSP属性范围(转)

    所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围. 一.JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:一个属性只能在一个页面中取得 ...

  8. [Codeforces Round #297 Div. 2] E. Anya and Cubes

    http://codeforces.com/contest/525/problem/E 学习了传说中的折半DFS/双向DFS 先搜前一半数,记录结果,然后再搜后一半数,匹配之前结果. #include ...

  9. cogs2060 除法表达式

    http://blog.csdn.net/sdfzyhx/article/details/52254071 作为分母的数当然是越少越好.将x2作为分母,其他作为分子,不断约分,最后判断. /*by S ...

  10. 【NOIP2016练习】T2 花花的聚会 (树形DP,倍增)

    题意: 花花住在 H 国.H 国有 n 个城市,其中 1 号城市为其首都.城市间有 n 1 条单向道路.从任意一个城市出发,都可以沿着这些单向道路一路走到首都.事实上,从任何一个城市走到首都的路径是唯 ...