5

MongoDB对reduce阶段的解释说:

map/reduce 引擎可以迭代调用 reduce 函数;因此,这些函数必须是幂等的。

这就是我一直理解 reduce 在一般 map reduce 环境中工作的方式。在这里,您可以通过减少每台机器上的值来对 N 台机器上的值求和,然后将这些输出发送到另一个减速器。

维基百科说

框架为排序顺序中的每个唯一键调用一次应用程序的 Reduce 函数。Reduce 可以遍历与该键关联的值并产生零个或多个输出。

在这里,您需要将所有值(使用相同的键)移动到同一台机器上进行求和。将数据移动到函数似乎与 map reduce 应该做的相反。

维基百科的描述是否过于具体?还是 MongoDB 破坏了 map-reduce?(或者我在这里错过了什么?)

4

3 回答 3

4

这就是Google 描述原始 Map Reduce 框架的方式:

2 编程模型

[...]

中间值通过迭代器提供给用户的 reduce 函数。这使我们能够处理太大而无法放入内存的值列表。

然后:

3 实施

[...]

6.reduce 工作程序遍历已排序的中间数据,并且对于遇到的每个唯一中间键,它将键和相应的一组中间值传递给用户的 Reduce 函数。

所以只有一次调用Reduce. 通过在本地使用特殊的组合器函数来解决移动大量小的中间对的问题:

4.3 合路器功能

在某些情况下,每个映射任务生成的中间键存在大量重复 [...] 我们允许用户指定一个可选Combiner函数,该函数在通过网络发送此数据之前对其进行部分合并。

Combiner函数在每台执行地图任务的机器上执行。通常使用相同的代码来实现组合器和归约函数。[...]

部分合并显着加快了某些类型的 MapReduce 操作。

TL;博士

Wikipedia 遵循最初的 MapReduce 设计,MongoDB 设计者采取了稍微不同的方法。

于 2012-10-18T14:35:02.870 回答
2

根据谷歌 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。

于 2012-10-18T15:11:39.400 回答
0

TLDR : reduce (mongo) 就像组合器,而 finalize(mongo) 几乎就像 reducer,只是它只需要一个键/值。如果您需要将所有数据放在 reduce (hadoop) 函数中,请将其与 reduce (mongo) 聚合到一个大数组中,然后将其传递给 finalize。在输出值中使用某种标志来执行此操作。

我就是这样做的,我认为它会吸收大量数据,但我不知道使用 mongodb mapreduce 的任何其他方法:((但我对它不是很有经验)

于 2013-09-09T09:09:26.080 回答