好的MapReduce示例[关闭]


202

除了“如何使用MapReduce计算长文本中的单词数”任务以外,我没有想到任何其他好的示例。我发现这并不是让其他人印象深刻的最好的例子,该工具的强大功能。

我不是在寻找代码片段,实际上只是在寻找“文本”示例。


1
我认为,一个类似但更好的示例是为计算机上所有文本文件计算单词数。它更容易理解和演示MapReduce的功能。
李·彼得(Peter Lee)

5
对于我搜索的最后四个问题,我发现它们在此站点上被认为是非建设性的。幸运的是,他们已经有了答案。对于作者,我表示感谢,到目前为止,有80多个人不了解关闭政策。但这对其他人并不重要,但是自80年代初以来,我一直是一名专业程序员,到现在,我发现自己在问一个错误的问题:)
Helder Velez 2014年

1
值得一看的是MapReduce设计模式:例如,这些幻灯片中涉及的一些内容以及更多内容都可以在本书中
Denis

Answers:


297

Map reduce是一个旨在有效处理大量数据的框架。例如,如果我们在数据集中有100万条记录,并且以关系表示形式存储,则导出值并对其进行任何类型的转换将非常昂贵。

例如,在SQL中,以给定的出生日期为例,要找出多少个人年龄大于30岁且拥有一百万条记录,这将花费一些时间,并且只有在查询的复杂性增加时,这才按顺序排列。Map Reduce提供了一个基于集群的实现,其中数据以分布式方式处理

这是维基百科的文章,解释了map-reduce所有内容

另一个很好的例子是通过map reduce查找朋友可以成为理解概念的有力例子,并且是一个很好用的用例。

就个人而言,发现此链接对于理解概念非常有用

复制博客中提供的说明(以防链接过期)

寻找朋友

MapReduce是最初由Google开发的框架,可在多个域中轻松进行大规模分布式计算。Apache Hadoop是一个开源实现。

我将详细介绍这些细节,但是归结为定义两个函数:map函数和reduce函数。map函数采用一个值并输出key:value对。例如,如果我们定义一个映射函数,该函数接受一个字符串并输出单词的长度作为键,单词本身作为值,则map(steve)将返回5:steve,而map(savannah)将返回8:savannah 。您可能已经注意到map函数是无状态的,只需要输入值即可计算出它的输出值。这使我们可以针对值并行运行map函数,并提供了巨大的优势。在使用reduce函数之前,mapreduce框架通过键将所有值分组在一起,因此,如果map函数输出以下key:value对:

3 : the
3 : and
3 : you
4 : then
4 : what
4 : when
5 : steve
5 : where
8 : savannah
8 : research

他们分为:

3 : [the, and, you]
4 : [then, what, when]
5 : [steve, where]
8 : [savannah, research]

这些行中的每一行都将作为参数传递给reduce函数,该函数接受键和值列表。在这种情况下,我们可能试图找出存在一定长度的单词,因此我们的reduce函数将只计算列表中的项数并输出具有列表大小的键,例如:

3 : 3
4 : 3
5 : 2
8 : 2

减少也可以并行完成,再次提供了巨大的优势。然后我们可以查看这些最终结果,发现我们的语料库中只有两个长度为5的单词,依此类推...

mapreduce的最常见示例是计算单词在语料库中出现的次数。假设您有一个Internet副本(我很幸运能够在这种情况下工作),并且想要一个Internet上每个单词的列表以及它出现了多少次。

您将采用的方法是标记您拥有的文档(将其分解为单词),然后将每个单词传递给映射器。然后,映射器会将单词连同值一起吐出1。分组阶段将使用所有键(在本例中为单词),并列出1。然后,reduce阶段将获取一个键(单词)和一个列表(该键每次出现在互联网上时,列表为1的列表),并对列表求和。然后,reducer输出单词及其计数。说完所有内容后,您将在互联网上获得每个单词的列表以及出现的次数。

容易吧?如果您曾经读过有关mapreduce的内容,那么上述情况并不是什么新鲜事物……它是mapreduce的“ Hello,World”。因此,这是一个真实的用例(Facebook可能会或可能不会实际执行以下操作,这只是一个示例):

Facebook有一个朋友列表(请注意,朋友在Facebook上是双向的。如果我是您的朋友,那么您是我的)。它们还具有大量磁盘空间,并且每天处理数亿个请求。他们决定在可以减少请求处理时间的情况下预先计算计算量。一种常见的处理请求是“您和Joe有230个共同的朋友”功能。访问某人的个人资料时,您会看到一个共同的朋友列表。该列表不会经常更改,因此每次访问配置文件时都要重新计算它(确保可以使用适当的缓存策略,但之后我将无法继续针对此问题写有关mapreduce的信息)。我们将使用mapreduce,以便我们可以计算每个人的 每天一次,将这些结果存储起来。稍后只是快速查找。我们有很多磁盘,很便宜。

假设朋友存储为Person-> [朋友列表],则我们的朋友列表为:

A -> B C D
B -> A C D E
C -> A B D E
D -> A B C E
E -> B C D

每行都是映射器的参数。对于朋友列表中的每个朋友,映射器都会输出一个键值对。密钥将与该人成为朋友。该值将是朋友列表。将对密钥进行排序,以便朋友井井有条,从而使所有成对的朋友都转到同一个减速器。这很难用文本解释,所以让我们来做一下,看看是否可以看到该模式。完成所有映射器的运行后,您将获得如下列表:

For map(A -> B C D) :

(A B) -> B C D
(A C) -> B C D
(A D) -> B C D

For map(B -> A C D E) : (Note that A comes before B in the key)

(A B) -> A C D E
(B C) -> A C D E
(B D) -> A C D E
(B E) -> A C D E
For map(C -> A B D E) :

(A C) -> A B D E
(B C) -> A B D E
(C D) -> A B D E
(C E) -> A B D E
For map(D -> A B C E) :

(A D) -> A B C E
(B D) -> A B C E
(C D) -> A B C E
(D E) -> A B C E
And finally for map(E -> B C D):

(B E) -> B C D
(C E) -> B C D
(D E) -> B C D
Before we send these key-value pairs to the reducers, we group them by their keys and get:

(A B) -> (A C D E) (B C D)
(A C) -> (A B D E) (B C D)
(A D) -> (A B C E) (B C D)
(B C) -> (A B D E) (A C D E)
(B D) -> (A B C E) (A C D E)
(B E) -> (A C D E) (B C D)
(C D) -> (A B C E) (A B D E)
(C E) -> (A B D E) (B C D)
(D E) -> (A B C E) (B C D)

每行将作为参数传递给reducer。reduce函数将简单地将值列表相交,并输出与相交结果相同的键。例如,reduce((AB)->(ACDE)(BCD))将输出(AB):(CD),这意味着朋友A和B将C和D作为普通朋友。

减少后的结果是:

(A B) -> (C D)
(A C) -> (B D)
(A D) -> (B C)
(B C) -> (A D E)
(B D) -> (A C E)
(B E) -> (C D)
(C D) -> (A B E)
(C E) -> (B D)
(D E) -> (B C)

现在,当D访问B的个人资料时,我们可以快速查找(B D)并看到他们有3个共同的朋友(A C E)


4
另一个例子是分析来自世界各地的天气数据。查找任何给定区域的最大值和最小值。这是一个很好的例子。
rvphx

生成所有这些中间元组,然后再检查所有交集,这不是很乏味吗?仅生成所有可能的朋友对(例如AB AC BC等),然后将这些对与整个朋友列表(仅一对中的两个朋友中的朋友)一起传递到特定机器,并让其计算交点,岂不是更好?我在这里想念什么?
GrowinMan 2014年

8
如果A访问E的个人资料怎么办?尽管他们有共同的朋友,但最终结果中没有(A,E)。

1
@Pinch是因为A和E本身不是朋友。在那种情况下,这种方法似乎确实不够用(除非您考虑到A或E可以为非朋友隐藏他们的朋友列表:))
Pega88 2014年

1
@karthikr:我对分组阶段感到困惑。Map和Reduce显然可以并行运行,但是分组阶段又如何呢?它必须在单个线程中完成,否则我会丢失某些东西吗?
Dinaiz


4

您可以在MapReduce中执行的一组熟悉的操作是一组正常的SQL操作:SELECT,SELECT WHERE,GROUP BY等。

另一个很好的例子是矩阵乘法,其中传递M的一行和整个向量x并计算M * x的一个元素。


3

我不时向人们介绍MR概念。我发现人们熟悉的处理任务,然后将它们映射到MR范例。

通常我有两件事:

  1. 分组依据/汇总。在这里,改组阶段的优势显而易见。洗牌也是分布式排序的解释+分布式排序算法的解释也有帮助。

  2. 连接两个表。使用DB的人员熟悉该概念及其可伸缩性问题。展示如何在MR中完成。


要对非书呆子解释,我使用children方法:您有一堆渴望的孩子,还有很多卡。您给每个孩子一定数量的卡片,告诉他们按照卡片*甲板的背面,然后按照编号/图片然后通过西装进行排序,即每个孩子完成的地图功能并带给一组成年人,一次两个。每个成年人“减少”成一堆,然后每两个成年人给一个免费的成年人在那里的纸牌堆。也就是说,根据孩子/堆栈的数量,reduce函数可以多次运行。大多数人都会在第一次尝试时获得它
Mickey Perlstein 2016年
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.