8. 组合 Map 与 Reduce¶
8.1. MapReduce 范式¶
2004 年,Google 的 Jeffrey Dean 和 Sanjay Ghemawat 发表了一篇论文,描述了一种分布式计算范式,后来被称为 MapReduce 。它展示了函数式编程对 Google 组织可在分布式计算机集群上并行化的计算工作的方式所产生的影响。
Dean 和 Ghemawat 思想的要点是定义一个 映射函数 ,它会在分布到多台计算机上的多个数据集上并行执行指定的任务。然后,每个映射函数的结果被送回一个 归约函数 ,后者把这些结果累积成所要寻找的“答案”。
为了说明这一点,假设我们有一个名为 db2 的分布式数据库,其中存放销售人员记录,Smith 的销售记录在一台计算机上,Jones 的销售记录在第二台计算机上,Green 的销售记录在第三台计算机上。
var db2 = [ ["Jones", 9, 2, 8, 6, 4], ["Smith", 4, 1, 8, 32, 45],
["Green", 4, 4, 6, 1, 12, 8] ];
给定这个数据库,我们希望每台计算机上完成一项计算(即映射函数),返回销售人员的姓名以及该人员所有销售记录的总和。然后,这三项计算的结果被送回一个归约函数,由它选出销售额最高的销售人员。
> bestSalesPerson(db2)
[ 'Smith', 90 ]
下面的 bestSalesPerson 函数通过定义两个函数( mapper 和 reducer ),然后适当地调用 fp.reduce 来完成这一计算。请通读下面的幻灯片以了解更多细节,然后尝试其后的复习题。
下面这道随机化习题是关于 MapReduce 模型的。你必须连续三次答对才能获得分数。

