【问题标题】:Is Reduce always required to remove duplicates in MapReduce?是否总是需要 Reduce 来删除 MapReduce 中的重复项?
【发布时间】:2012-03-20 05:05:37
【问题描述】:

为什么 MapReduce 中需要 Reduce?如果计算一本书中的字数之类的工作如果由单个进程或 MapReduced 在一组服务器上执行会产生相同的结果,那么存在必须删除重复项的可能性吗?我假设 Reduce 步骤,至少在这个例子中,将简单地对每个工作进程的结果求和,并提供书中的总字数。我不明白任何东西的重复出现在图片中。

【问题讨论】:

    标签: map mapreduce parallel-processing reduce


    【解决方案1】:

    Reduce 步骤并不意味着删除重复项(尽管在某些情况下这是一个可能的用例)。 Reduce 用于聚合来自具有相同键的各种映射器的输出。

    例如,在字数统计示例中,节点 1 可能有 10 个单词实例,例如“学校”,节点 2 可能有 15 个实例,节点 3 可能有 12 个实例。现在如何计算总和?结果 10、15 和 12 在不同的节点上。有一个洗牌阶段将所有这些值带到一个节点(这是分区器分配给键“学校”的减速器)。那么reducer就会得到这个key的所有值,并且可以总结出来。

    编辑:正如 Tudor 所提到的,我所说的聚合是指更一般意义上的聚合,即“聚集在一起”

    EDIT2:澄清 RaffiM 的疑问: 继续上面的例子,假设节点 1 有第 1-10 页,节点 2 有第 11-20 页,节点 3 有第 21-30 页。因此,在 mao 阶段之后,我们知道第 1-10 页出现“学校”一词 10 次,第 11-20 页出现该词 15 次,同样,第 21-30 页出现 15 次。现在我们需要的是这个词在整本书中出现的总次数,所以我们还需要把这些加起来。我们需要 10+15+12+其他页面范围的数字...

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

    【讨论】:

    • 在书的例子中,为什么不向节点发送一系列页面,节点会计算该页面范围内的所有单词..这不是比发送单个单词更有效吗?
    • 这正是发生的事情。但是我们需要整本书中每个单词的计数,而不是特定的页面范围。我将在答案中添加更多细节以使其更清晰。
    • 我还是不明白...我们没有计算单个单词的出现次数,而是总单词数。
    • 再读一遍例子,我们要的是每个词出现的频率。即使我们想要总词数,我们仍然需要 reducer 来最终汇总每个映射器的单个词数。
    【解决方案2】:

    Reduce 是一种更通用的操作。它并不一定意味着“通过重复应用操作(例如求和)来聚合一堆数值”。 Map-Reduce的正式定义是由以下几个阶段组成的变换:

    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,...]) - 一个输入值对的键列表的操作,其中“值列表”是与键 k 对应的所有值的列表,这些值由 Map 阶段生成并生成键值或键- 值对列表,其中输出键的类型必须与输入键的类型相同,并且值是任意类型。

    这样,您会看到 Reduce 操作更加灵活和通用。

    【讨论】:

      猜你喜欢
      • 2019-04-21
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      相关资源
      最近更新 更多