【问题标题】:Is Wikipedia's explanation of Map Reduce's reduce incorrect?维基百科对 Map Reduce 的 reduce 的解释不正确吗?
【发布时间】:2012-10-18 14:23:49
【问题描述】:

reduce 阶段的MongoDB's explanation 说:

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

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

Wikipedia says:

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

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

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

【问题讨论】:

  • 我认为应该在相关的 wiki:disussion/talk 页面上询问 questuin。

标签: mongodb mapreduce


【解决方案1】:

原来的 Map Reduce 框架是这样的described by Google

2 编程模型

[...]

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

后来:

3 实施

[...]

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

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

4.3 合路函数

在某些情况下,每个 map 任务生成的中间键存在大量重复 [...] 我们允许用户指定一个可选的 Combiner 函数,该函数在此数据通过网络。

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

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

TL;DR

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

【讨论】:

    【解决方案2】:

    根据Google MapReduce paper

    reduce worker 读取完所有中间数据后,会根据中间键对其进行排序 以便将所有出现的相同键组合在一起。

    MongoDB document

    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”,description 表示“作业中应在为作业安排 reduce 之前完成的地图数量的一部分。”

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

    此外,map 任务而不是 reduce 任务考虑了数据局部性。对于 reduce 任务,数据必须从不同节点上的不同映射器移动到 reducer 以进行聚合。

    只是我的 2c。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多