5

我在http://en.wikipedia.org/wiki/MapReduce阅读了 mapreduce ,了解了如何在许多“文档”中获取“单词”计数的示例。但是我不明白以下行:

因此,MapReduce 框架将(键,值)对列表转换为值列表。这种行为不同于函数式编程 map 和 reduce 组合,后者接受任意值的列表并返回一个组合 map 返回的所有值的单个值。

有人可以再次详细说明区别(MapReduce框架VS map和reduce组合)吗?特别是,reduce 函数式编程有什么作用?

非常感谢。

4

3 回答 3

8

主要区别在于 MapReduce 显然是可申请专利的。(忍不住,对不起……)

更重要的是,我记得 MapReduce 论文描述了一种以大规模并行方式执行计算的方法。这种方法建立在多年前广为人知的 map/reduce 构造之上,但超越了诸如分发数据等问题。此外,对正在操作的数据结构施加了一些限制,并由计算的map-like 和reduce-like 部分(关于数据来自键/值对列表的事情),所以你可以说 MapReduce 是 & 组合的大规模并行友好的专业化mapreduce

至于 Wikipedia 上关于在函数式编程的map/reduce构造中映射的函数的评论,每个输入产生一个值……嗯,确实如此,但是这里对所述值的类型没有任何限制。特别是,它可能是一个复杂的数据结构,例如您将再次应用map/reduce转换的事物列表。回到“计算单词”示例,您很可能拥有一个函数,该函数对于给定的文本部分生成一个数据结构,将单词映射到出现次数,map该数据结构覆盖您的文档(或文档块,视情况而定)是)和reduce结果。

事实上,这正是Phil Hagelberg的这篇文章中发生的事情。这是在 Clojure 中实现的类似 MapReduce-word-counting 的计算的一个有趣且极其简短的示例,它具有map等效于reduce(apply + (merge-with ...))位 -在 clojure.coremerge-with中实现)的东西。reduce此示例与 Wikipedia 示例之间的唯一区别是被计数的对象是 URL,而不是任意单词——除此之外,您还有一个计数单词算法,使用mapreduce,MapReduce 风格,就在那里。它可能不完全符合作为 MapReduce 实例的原因是不涉及复杂的工作负载分布。这一切都发生在一个盒子上……尽管盒子提供的所有 CPU 上。

有关该函数的深入处理(reduce也称为),fold请参阅 Graham Hutton 的关于 fold 的普遍性和表现力的教程。它是基于 Haskell 的,但即使你不懂该语言也应该是可读的,只要你愿意随时查找一两个 Haskell 东西......像++= 列表连接之类的东西,没有深入的 Haskell 魔法。

于 2010-01-23T04:48:20.847 回答
1

使用字数统计示例,原始函数map()将获取一组文档,可选地分发该集合的子集,并为每个文档发出一个表示文档中单词数(或特定单词出现次数)的值。然后一个函数reduce()将所有文档的全局计数相加,每个文档一个。所以你得到一个总计数(所有单词或特定单词)。

在 MapReduce 中,地图将为每个文档中的每个单词发出一个 (word, count) 对。然后, MapReduce会将每个文档中每个单词的计数相加,而不会将它们混合成一堆。所以你会得到一个与它们的计数配对的单词列表。reduce()

于 2010-01-23T03:42:31.340 回答
1

MapReduce 是一个围绕将计算拆分为可并行化的映射器和化简器而构建的框架。它建立在熟悉的 map 和 reduce 习惯上——如果您可以构建任务以便它们可以由独立的 mapper 和 reducer 执行,那么您可以以利用 MapReduce 框架的方式编写它。

想象一个 Python 解释器,它识别可以独立计算的任务,并将它们分流到映射器或减速器节点。如果你写

reduce(lambda x, y: x+y, map(int, ['1', '2', '3']))

或者

sum([int(x) for x in ['1', '2', '3']])

您将在 MapReduce 框架中使用函数式 map 和 reduce 方法。使用当前的 MapReduce 框架,涉及更多的管道,但它是相同的概念。

于 2010-01-26T19:59:08.623 回答