根据谷歌 MapReduce 论文
当reduce worker 读取所有中间数据时,它会按中间键对其进行排序,以便将所有出现的相同键组合在一起。
MongoDB文档说
map/reduce 引擎可以迭代调用 reduce 函数;因此,这些函数必须是幂等的。
因此,对于 Google 论文中定义的 MapReduce,一旦特定键的数据传输到化简器,化简就会开始处理键/值对。但是,正如 Tomasz 提到的,MongoDB 似乎以稍微不同的方式实现 MapReduce。
在 Google 提出的 MapReduce 中,Map 或 Reduce 任务将处理 KV 对,但在 MongoDB 实现中,Map 和 Reduce 任务将同时处理 KV 对。MongoDB 方法可能效率不高,因为节点没有得到有效使用,并且集群中的 Map 和 Reduce 插槽可能已满并且可能无法运行新作业。
Hadoop 中的问题是,尽管 reducers 任务在 map 完成处理数据之前不会处理 KV 对,但可以在 mapper 完成处理之前生成 reducers 任务。参数“mapreduce.job.reduce.slowstart.completedmaps”设置为“0.05”,描述为“在为作业安排reduce之前应该完成的作业中映射数量的分数”。
在这里,您需要将所有值(使用相同的键)移动到同一台机器上进行求和。将数据移动到函数似乎与 map reduce 应该做的相反。
此外,数据局部性被考虑用于 map 任务而不是 reduce 任务。对于 reduce 任务,数据必须从不同节点上的不同映射器移动到 reducer 以进行聚合。
只是我的2c。