Google的MapReduce是一种分布式计算的框架,它的设计的目标就是在廉价PC组成的集群中,并行处理大规模的数据。另外的一个设计思路就是限制计算的模型以在分布以及运算上面得以优化。

整个过程分为两部分,Map和Reduce这两个和函数式编程语言都有很大的联系。Map即是将数据从一个集合映射到另外一个以(key, value)键值对元组组成的集合,而Reduce即为在(key, value)键值对的集合中合并key相同的元素,最终生成结果。这样说很复杂,举论文中的一个小例子来说明一下:

Count of URL Access Frequency问题,即从一个web access的log里面去计算每个url被访问的次数。那么Map的工作就是根据每一条记录生成(URL, 1)的一个键值对集合,Reduce就将相同的key值(URL)的元素合并起来,将它们的value(每一项均为1)加起来,得出最终的集合就是要求的结果。

由于Reduce是从Map的机器中pull得到Map的结果, 对于普通的磁盘来说, 多个Reduce进程同时通过网络读取Map的结果的时候会严重拖累读取的速度.

一般Map/Reduce的实例数是集群中worker数量的几倍, 原因是当一个worker挂掉的时候, 可以将它的Map/Reduce工作平均分给集群中的其他worker, 以免拖累整体完成速度.

针对木桶效应的问题, 每当Master发现一个操作要接近结束的时候就开始一群备用的worker和最开始的worker去同时执行剩下的操作. 只要备用的和最开始的worker其中之一完成了整个过程就完成了. 这样主要是为了解决某些worker因为硬件问题或者负载问题而导致的运行速度低下. 应用了这个机制之后某些计算速度提升高达44%

MapReduce处理机器之间性能不对等的基本思路就是将整个计算的过程分成接很小规模的计算(微粒),然后动态的将这些微粒分配给各个worker,快的worker就处理更多的数据,以此来调节整个运算的平衡性.

论文中总结的MapReduce的优点是:

  1. 编程简单=>即使没有学过并行编程的人来说在这个框架下写程序也是非常容易的事情,因为它隐藏了许多并行编程的内部问题比如机器当掉的处理,本地优化和负载均衡。
  2. 很多计算都是可以用Map和Reduce两个过程进行解决
  3. MapReduce能够运行在数千台机器规模的集群上,运用计算机数量的优势处理大规模的数