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