除了“如何使用MapReduce计算长文本中的单词数”任务以外,我没有想到任何其他好的示例。我发现这并不是让其他人印象深刻的最好的例子,该工具的强大功能。
我不是在寻找代码片段,实际上只是在寻找“文本”示例。
除了“如何使用MapReduce计算长文本中的单词数”任务以外,我没有想到任何其他好的示例。我发现这并不是让其他人印象深刻的最好的例子,该工具的强大功能。
我不是在寻找代码片段,实际上只是在寻找“文本”示例。
Answers:
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)
。
请记住,尽管它们仅限于MapReduce想法的基于键值的实现(因此它们的适用性受到限制)。
我不时向人们介绍MR概念。我发现人们熟悉的处理任务,然后将它们映射到MR范例。
通常我有两件事:
分组依据/汇总。在这里,改组阶段的优势显而易见。洗牌也是分布式排序的解释+分布式排序算法的解释也有帮助。
连接两个表。使用DB的人员熟悉该概念及其可伸缩性问题。展示如何在MR中完成。