map / reduce引擎可以迭代地调用reduce函数;从而, 这些功能必须是幂等的。
这就是我总是理解减少在一般地图缩小环境中工作的方式。 在这里,您可以通过减少每台机器上的值,然后将这些输出发送到另一台减速器来对N台机器的值求和。
框架为每个应用程序调用一次Reduce函数 排序顺序中的唯一键。 Reduce可以遍历 与该键关联并生成零或更多的值 输出。
在这里,您需要将所有值(使用相同的键)移动到要求的同一台机器上。将数据移动到函数似乎与map reduce应该做的相反。
维基百科的描述是否过于具体?或者MongoDB是否打破了map-reduce? (或者我在这里错过了什么?)
答案 0 :(得分:4)
这是原始Map Reduce框架的described by Google:
2编程模型
[...]
中间值通过迭代器提供给用户的reduce函数。这允许我们处理太大而不适合内存的值列表。
后来:
3实施
[...]
6.
reduce工作程序遍历已排序的中间数据,并且对于遇到的每个唯一中间密钥,它将密钥和相应的中间值集传递给用户的Reduce函数。
因此只有Reduce
的一次调用。通过在本地使用特殊的组合器函数来解决移动大量小型中间对的问题:
4.3组合器功能
在某些情况下,每个map任务产生的中间键都会有重大的重复[...]我们允许用户指定一个可选的
Combiner
函数,该函数在发送之前对这些数据进行部分合并通过网络。在执行映射任务的每台计算机上执行
Combiner
函数。通常,相同的代码用于实现组合器和reduce函数。 [...]部分组合显着加快了某些类别的MapReduce操作。
维基百科遵循原始MapReduce设计,MongoDB设计师采取了略微不同的方法。
答案 1 :(得分:2)
当reduce worker读取所有中间数据时,它会通过中间键对其进行排序 以便将所有出现的相同密钥组合在一起。
map / reduce引擎可以迭代地调用reduce函数;因此,这些功能必须是幂等的。
因此,如果Google论文中定义了MapReduce,则在特定键的数据传输到reducer后,reduce开始处理键/值对。但是,正如Tomasz所说,MongoDB似乎以稍微不同的方式实现了MapReduce。
在Google提出的MapReduce中,Map或Reduce任务将处理KV对,但在MongoDB实现中,Map和Reduce任务将同时处理KV对。 MongoDB方法可能效率不高,因为节点没有得到有效使用,集群中的Map和Reduce插槽可能已满,可能无法运行新作业。
Hadoop中的捕获虽然reducers任务不处理KV对,直到地图完成处理数据,但是在映射器完成处理之前可以生成reducers任务。参数“mapreduce.job.reduce.slowstart.completedmaps”并设置为“0.05”,description表示“作业中应该完成的作业中的地图数量的分数是为作业安排的。 “
在这里,您需要将所有值(使用相同的键)移动到要求的同一台机器上。将数据移动到函数似乎与map reduce应该做的相反。
此外,数据位置考虑用于地图任务,而不是reduce任务。对于reduce任务,必须将数据从不同节点上的不同映射器移动到reducers以进行聚合。
只是我的2c。
答案 2 :(得分:0)
TLDR:reduce(mongo)就像组合器一样,而finalize(mongo)几乎就像reducer一样,只需要一个键/值。如果你需要在reduce(hadoop)函数中包含所有数据,请将它与reduce(mongo)聚合成一个大数组并传递给finalize。在输出值中使用某种标志来执行此操作。
我就是这样做的,我觉得它会吸引大量的数据,但我不知道用mongodb mapreduce做任何其他方法:((但我对它不是很有经验)