MapReduce的新颖之处是什么?


67

几年前,MapReduce被誉为分布式编程的革命。也有批评家但总的来说是热心的炒作。它甚至获得了专利![1]

这个名字让人联想到的mapreduce函数式编程,但是当我阅读(维基百科)

映射步骤:主节点获取输入,将其分为较小的子问题,然后将其分配给工作节点。辅助节点可以依次再次执行此操作,从而导致多层树结构。工作节点处理较小的问题,并将答案传递回其主节点。

减少步骤:主节点然后收集所有子问题的答案,并以某种方式将它们组合起来以形成输出-最初试图解决的问题的答案。

或[2]

MAP的内部原理: MAP将输入值分割为多个单词。MAP旨在将输入的每个给定键/值对与潜在的许多中间键/值对相关联。

REDUCE的内部要素: [REDUCE]执行命令式聚合(例如,减少):采用许多值,并将其减少为单个值。

我忍不住想:这是分而治之(在Mergesort的意义上),简单明了!那么,MapReduce中是否存在(概念上的)新颖性,还是只是在某些情况下有用的旧思想的新实现?


  1. 美国专利7,650,331:“有效进行大规模数据处理的系统和方法”(2010)
  2. Google的MapReduce编程模型 -R.Lämmel(2007)重新审视

7
没有新颖性。我不会回答这个问题,但是我坚信,MapReduce并没有发现任何新的计算甚至分布式计算。
edA-qa mort-ora-y

@Aryabhata:如果有新颖性,这个问题有一个很好的,建设性的答案。如果没有,那么可以说没有什么可以证明的(除了可能将MapReduce明确地降低为较旧的技术),还不错。但是,如果您有这种感觉,请务必投票!
拉斐尔

@ edA-qamort-ora-y:在这种情况下,我们应该能够用较旧的术语来表达MapReduce,将是一个很好的答案!
拉斐尔

1
@Raphael,我同意,但是我不确定我能做到这一点。但是,我可以观察到,如此处所述(第一引号),合并排序使用的是map / reduce的确切方法。实际上,它可以零变分布。
edA-qa mort-ora-y 2012年

Answers:


47

我禁不住想:这是分而治之,朴素而简单!

M / R不是分而治之。它不涉及对先前输入的较小子集重复应用算法。它是管道(指定为简单函数组成的函数),其中管道阶段交替映射和减少操作。不同的阶段可以执行不同的操作。


那么,MapReduce中是否存在(概念上的)新颖性,还是只是在某些情况下有用的旧思想的新实现?

MapReduce并没有在计算理论上开辟新天地-它没有显示出将问题分解为更简单操作的新方法。它确实表明特定的简单操作对于特定类型的问题是可行的。


MapReduce的纸的贡献

  1. 评估两个很好理解的正交运算符的流水线,这些运算符可以针对特定问题高效且容错地分布:创建大型语料库的文本索引
  2. 对这个问题进行基准测试,减少映射,以显示节点之间传输了多少数据以及阶段中的延迟差异如何影响总体延迟
  3. 展示了如何使系统具有容错能力,从而可以自动补偿计算过程中的机器故障
  4. 确定特定的有用实施选择和优化

一些批评属于以下类别:

  1. “ Map / reduce不会在计算理论上开辟新的天地。” 真正。原始论文的贡献在于,这些经过充分理解的运算符具有一组特定的优化功能,已被成功用于比一次性解决方案更容易,更容错地解决实际问题。
  2. “这种分布式计算不容易分解为map&reduce操作”。足够公平,但是很多都可以。
  3. “ n个映射/归约阶段的流水线需要的延迟时间与流水线的缩减步骤数成正比,然后才能产生任何结果。” 可能是真的。reduce运算符确实必须先接收所有输入,然后才能产生完整的输出。
  4. “在这个用例中,映射/缩减是过大的。” 也许。当工程师找到闪亮的新锤子时,他们倾向于去寻找任何看起来像钉子的东西。这并不意味着锤子对于某些利基市场来说并不是一种精良的工具。
  5. “ Map / reduce不能很好地替代关系数据库。” 真正。如果关系数据库可以扩展到您的数据集,那么对您来说很棒-您可以选择。

好吧,他们称原始论文为“ seminal”,所以我期望有新的东西。我没有得到您的第一段:显然,有很多算法技术并没有治之。如果MapReduce对于特定的问题集“仅”是d&c的有效实现,那么在算法学(imho)中肯定没有开创性或专利性。那并不是说它不是一个好的系统。请注意,我对MapReduce本身的批评较少(我想这对它的用途有好处),而不是受到社区的欢迎。
拉斐尔

1
@Raphael,我认为M / R并不是您所链接到的分而治之。它不涉及对原始输入的较小子集重复应用算法。这是一个管道,其中管道阶段交替映射和减少操作。
Mike Samuel

嗯,是的。我解释说“一个工作节点可能又会再次执行此操作,从而导致多层树结构。” 这样,但这当然并不意味着在每个级别上都会发生相同的情况。
拉斐尔

1
@ ex0du5,我想您可能会因为它没有提出要求而谴责它。“许多系统提供了受限制的编程模型,并使用了这些限制来自动并行化计算。...根据我们在大型实际计算中的经验,MapReduce可以被认为是其中某些模型的简化和提炼。 ,大多数并行处理系统仅在较小的规模上实现,而处理机器故障的细节留给程序员。” 它引用了Rabin和Valiant的论文,但没有引用Liskov的论文。
Mike Samuel

1
@ ex0du5,足够公平。我认为“ Map / reduce不会在计算理论上开辟新天地。”是的。很清楚,但我已经重写了捐款清单。
Mike Samuel

21

编辑(2014年3月)我应该说,自那以后,我在MapReduce类型的计算模型的算法研究上投入了更多精力,我感到自己过于消极了。我在下面谈论的分压合并征服技术令人惊讶地用途广泛,并且可以作为我认为平凡而有趣的算法的基础。


让我提供一个在综合性方面要逊于迈克的答案,但是从计算/算法理论的角度来看。

O(nϵ)o(logn)

O(1)

  • 对问题实例进行分区(通常是随机的)
  • 在每个分区上并行执行一些计算,并紧凑地表示计算结果
  • 将所有紧凑表示的子问题解决方案组合在一个处理器上,并在那里完成计算

nO(n)n

现在,我认为这实际上是分而治之的一个有趣转折,即转折阶段之后,您需要压缩子问题解决方案,以便单个处理器可以征服。但是,这似乎是到目前为止我们提出的唯一技术。对于稀疏图的问题,例如稀疏连通性,它会失败。将其与流模型进行对比,该模型带来了许多新的想法,例如Flajolet和Martin的独创采样算法,Misra和Gries的确定性配对算法,简单的草图绘制技术的强大功能等。

作为编程范例,map reduce非常成功。我的评论认为map reduce是一种有趣的计算模型。好的理论模型有点奇怪。如果它们过于严格地遵循现实,那么它们将是笨拙的,但是更重要的是,(从机器学习中借用一个术语)针对过于具体的模型证明的定理不会泛化,即在其他模型中不成立。这就是为什么我们要尽可能多地提取细节,同时又要挑战我们提出新颖的算法。最后,这些新想法应该最终能够找到回到现实世界的方式。PRAM是一种不切实际的模型,导致产生有趣的想法,但是事实证明,这些想法很少适用于现实世界的并行计算。另一方面,流媒体也不现实,但它启发了实际应用的算法思想。看到数分钟草图。实际上,草图绘制技术也用于基于map reduce的系统中。


可以说M / R比PRAM或流更现实(有用)的模型。(至少是针对一些相当大的问题。)
Xodarap 2012年

“您需要压缩子问题解决方案,以便单个处理器可以征服”-您似乎在说,M / R可以解决的问题集是存在可感知的高速缓存感知或高速缓存的问题的子集-遗忘的解决方案。如果是正确的话,那么在我看来,该陈述同样适用于大多数分布式计算方案。
Mike Samuel

1
@Xodarap可能是。在这里,我使用的是纯粹的算法理论家的观点:如果模型能带来新的算法视角,则它很有用。通过这种方式,流媒体并不是完全现实的,而是导致了许多实际上在实践中有用的新技术。关键是,什么是导致新思维的正确抽象。当前的MR抽象取得的成就喜忧参半(但我想还是有些成功)
Sasho Nikolov

1
@MikeSamuel该句子中的“需要”表示这是该技术需要工作的内容,而不是唯一可行的方法。我所知的MR并没有理论上的负面结果。我的抱怨并不是MR的功能不比CO强大。这是因为我们没有看到模型启发了很多新的算法思想(这对系统来说很好,但对计算模型却令人失望)。另一方面,缓存遗忘本身是一个了不起的想法imo
Sasho Nikolov

@SashoNikolov,了解了。感谢您的解释。
Mike Samuel

6

我完全同意你的看法。从概念上讲,没有什么真正的新东西:Map / Reduce最初在并行计算中被称为数据流编程模型。但是,从实际的角度来看,由Google提出的Map / Reduce及其后续的开源实现也推动了Cloud Computing的发展,现在非常流行于非常简单的并行分解和处理。当然,它不适用于需要复杂域或功能分解的任何其他事物。


3

我认为您的评论已经使您大为震惊。

在任何功能性语言中,映射都不能并行化-语言必须是纯净的。(我相信Haskell是唯一模糊的主流纯功能语言。Lisp,OCaml和Scala都不是纯语言。)

自从甚至在分时共享之前,即工程师首次通过流水线处理处理器以来,我们就已经知道纯代码的好处。那么,为什么没有人使用一种纯粹的语言呢?

真的,真的,真的很难。用纯语言编程通常感觉像是双手背在后面。

MR所做的是在某种程度上放松了纯度约束,并为其他部分(例如混洗阶段)提供了框架,从而使得针对大部分问题编写可分发的代码变得相当容易。

NC=P


我对MapReduce并不熟悉,但是您对它的介绍与我记得上个世纪在Parallelism 101中理想情况下的介绍没什么不同。
吉尔斯

@吉尔斯:我的意图只是表明“分裂与征服”!=“可分配的分裂与征服”。尽管可以说M / R并不是原始的,但它却不那么琐碎。
Xodarap

在函数式编程中,所有映射都可以并行化(令人尴尬),那么为什么不坚持该范例呢?我看不到count伪代码中的共享变量如何;只需将其当前值传递给do_something应该即可。您能否举一个递归调用相互依赖(在发出调用之后)的“真实” d&c算法(Mergesort,Quicksort等)的示例?
拉斐尔

@Raphael:为了确保更好地回应您的评论,我已经重写了答案。如果您仍然愿意,我可以举一个纯度令人讨厌的例子。
Xodarap

1
@Raphael:我同意,如果我能引用一些论文表明使用M / R将编程时间从X小时减少到Y,或者通过强制纯净从A增加到B,则我的答案会更好,但是我想我可以要做的就是愤怒地挥舞着我的手,坚持认为差异是不平凡的。
Xodarap
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.