2012-03-01 53 views
1

为什么在MapReduce中需要Reduce?如果一项工作(例如统计书中单词的数量)将导致相同的结果(如果由单个流程执行或MapReduced在服务器场中执行),那么重复项必须被删除的可能性有多大?我假定Reduce步骤,至少在本例中,将简单地汇总来自每个工作进程的结果并提供本书中单词的总数。我不明白哪里有重复的东西出现在图片中。是否总是需要删除MapReduce中的重复项?

回答

1

Reduce步骤并不意味着删除重复项(尽管在某些情况下这是一个可能的用例)。 Reduce是为了汇总来自不同映射器的输出而使用相同的密钥。

例如,在单词计数示例中,节点1可能会得到一个单词的10个实例,例如“school”,节点2可能有15个实例,节点3 12个实例。现在如何计算总和?结果10,15和12在不同的节点上。有一个随机播放阶段,将所有这些值带到一个节点(这是分区器分配给关键“学校”的缩减器)。然后减速器将具有该键的所有值,并且可以将它们相加。

编辑:由于铎提到的,通过聚集我的意思是“汇集”

EDIT2的更一般意义上的聚集:为了澄清RaffiM的疑问: 继续上面的例子,假设节点1有1页10,节点2有11-20页,节点3有21-30页。因此,在毛泽东之后,我们知道Pages 1-10有10次单词“school”,11-20页有15次出现,15-30次出现在第21-30页。现在我们需要的是这个词在整本书中出现的总次数,所以我们仍然需要添加这些词。我们需要10 + 15 + 12 +其他页面范围的数字......

如果您不使用组合器,则映射器每次出现该单词时都会发送“1”。因此,对于1-10页,它将发送<“学校”,1>作为输出键值10次。为了提高效率,我们使用组合器,在映射器级别对其进行汇总。因此,如果您使用组合器,它将在节点1本身中消耗此资源,并为节点1生成合并输出<“学校”,10>。

+0

在本书的例子中,为什么不发送页面范围到一个节点,节点统计该页面范围内的所有单词..没有比发送单个单词更有效吗? – raffian 2012-03-01 17:28:29

+0

这正是发生的情况。但是我们需要整本书中每个单词的计数,而不是特定的页面范围。我会在答案中增加更多细节以使其更清楚。 – 2012-03-01 17:45:14

+0

我还是不明白......我们不计算单个词的出现,只是总词。 – raffian 2012-03-03 01:06:16

5

减少是一种更为普遍的操作。这并不一定意味着“通过重复应用操作(例如求和)来聚合一堆数值”。的正式定义地图,减少是,它是一个以下阶段组成的转化:

  1. Map: (K k, V v) -> (K' k, V' v1 [, v2,...]) - 即在输入有一个键 - 值对分别类型K和V,的操作,并产生一个密钥可能不同类型的值的值或键列表结果。
  2. 执行分区的混洗阶段。
  3. Reduce: (K' k, V' v1 [, v2,...]) -> (K' k, V'' v1 [, v2,...]) - 一种操作,用于输入值对的键值列表,其中“值列表”是由Map阶段生成的与键k相对应的所有值的列表,并生成键值或键值。值列表配对,其中输出密钥必须与输入密钥具有相同的类型,并且该值为任意类型。

这样,您会发现Reduce操作更加灵活和一般。