Mongodb 是维基百科';s对Map-Reduce'的解释;什么是不正确的?

Mongodb 是维基百科';s对Map-Reduce'的解释;什么是不正确的?,mongodb,mapreduce,Mongodb,Mapreduce,“减少”阶段的主要内容是: map/reduce引擎可以迭代调用reduce函数;因此 这些函数必须是幂等的 这就是我一直理解reduce在通用map-reduce环境中工作的方式。 在这里,您可以通过减少每台机器上的值,然后将这些输出发送到另一个减速机,对N台机器上的值求和 : 框架每次调用应用程序的Reduce函数一次 排序顺序中的唯一键。Reduce可以遍历 与该键关联并生成零或多个值的值 产出 在这里,您需要将所有值(使用相同的键)移动到要求和的同一台机器上。将数据移动到函数似乎与map

“减少”阶段的主要内容是:

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

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

:

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

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


维基百科的描述是否过于具体?还是MongoDB破坏了地图?(或者我在这里遗漏了什么?

这就是最初的Map Reduce框架:

2编程模型 [……]

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

后来:

3实施 [……]

6.
reduce工作者迭代排序的中间数据,对于遇到的每个唯一中间键,它将键和相应的中间值集传递给用户的reduce函数

因此,只有一次调用
Reduce
。通过局部使用特殊的组合器函数,解决了移动大量小中间对的问题:

4.3组合器功能 在某些情况下,每个map任务生成的中间键中存在大量重复[…]我们允许用户指定可选的
组合器
功能,该功能在通过网络发送数据之前对数据进行部分合并

组合器
功能在执行映射任务的每台机器上执行。通常使用相同的代码来实现合并器和reduce函数。[……]

部分合并可显著加快某些类别的MapReduce操作

TL;博士 Wikipedia遵循原始的MapReduce设计,MongoDB设计师采用了稍微不同的方法。

根据

当reduce worker读取了所有中间数据时,它会按中间键对其进行排序 以便将同一关键点的所有引用组合在一起

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

因此,对于谷歌论文中定义的MapReduce,一旦特定键的数据传输到reducer,reduce就会开始处理键/值对。但是,正如Tomasz提到的,MongoDB似乎以一种稍微不同的方式实现MapReduce

在Google提出的MapReduce中,Map或Reduce任务将处理KV对,但在MongoDB实现中,Map和Reduce任务将同时处理KV对。MongoDB方法可能效率不高,因为没有有效地使用节点,而且集群中的Map和Reduce插槽可能已满,并且可能无法运行新作业

Hadoop中的问题是,虽然在映射完成数据处理之前,还原器任务不会处理KV对,但是在映射器完成处理之前,还原器任务可以生成。参数“mapreduce.job.reduce.slowstart.completedmaps”设置为“0.05”,并表示“在为作业计划reduce之前,作业中应完成的映射数的分数。”

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

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

就我的2c。

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


我就是这样做的,我认为这对于大数据量来说很糟糕,但我不知道用mongodb mapreduce做这件事的其他方法:((但我不是很有经验)

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