【问题标题】:“Combiner" Class in a mapreduce jobmapreduce 作业中的“Combiner”类
【发布时间】:2012-04-30 12:18:20
【问题描述】:

Combiner 在 Mapper 之后和 Reducer 之前运行,它将接收给定节点上 Mapper 实例发出的所有数据作为输入。然后向 Reducers 发出输出。

另外,如果reduce函数既是可交换的又是关联的,那么它可以用作Combiner。

我的问题是“commutative and associative”这句话在这种情况下是什么意思?

【问题讨论】:

    标签: hadoop mapreduce reducers combiners


    【解决方案1】:

    假设你有一个数字列表,1 2 3 4 5 6。

    这里的关联意味着您可以进行操作并将其应用于任何子组,然后将其应用于这些结果并得到相同的答案:

    (1) + (2 + 3) + (4 + 5 + 6)
      ==
    (1 + 2) + (3 + 4) + (5) + (6)
      ==
    ...
    

    将此处的括号视为组合器的执行。

    Commutative 表示顺序无关紧要,所以:

    1 + 2 + 3 + 4 + 5 + 6
      ==
    2 + 4 + 6 + 1 + 2 + 3
      ==
    ...
    

    例如,加法适合这个属性,如前所述。 “最大值”也适合上面的这个属性,因为 maxs 的最大值就是最大值。最大值(a,b)== 最大值(b,a)。

    中位数是一个不起作用的例子:中位数的中位数不是真正的中位数。


    不要忘记组合器的另一个重要属性:键/值的输入类型和键/值的输出类型必须相同。例如,您不能接受 string:int 并返回 string:float。

    通常,reducer 可能会输出某种字符串而不是数值,这可能会阻止您将 reducer 作为组合器插入。

    【讨论】:

    • 谁能大胆猜测投反对票的原因?我真的很想知道我的答案是否出于某种原因不好,因为这就是我一直向人们解释组合器的方式。谢谢!
    【解决方案2】:

    对于交换性,假设您的 reducer 可以用一个名为 f() 的函数(在数学术语中)表示。那么如果 f(a, b) = f(b, a) 你的 reducer 是可交换的 例如:

    • sum(A, B) 与 sum(B, A) 相同
    • xor(A, B) 与 xor(B, A) 相同
    • concat(A, B) 与 concat(B, A) 相同

    对于关联性,属性是 f(f(a, b), c) = f(a, f(b, c))。例如:

    • (A + B) + C 与 A + (B + C) 相同
    • (A - B) - C 与 A - (B - C) 相同

    因此,在 Map/Reduce 的上下文中,您的 reducer 必须尊重这两个属性。例如,如果你的 reducer 只做 sum() 或 max(),它会尊重这两个属性,但像 mean() 或 median() 这样的东西不会,因此你不能将它用作组合器。

    我个人认为组合器是在映射阶段之后在内存中运行的小型缩减器,作为减少网络流量的优化,如果您以这种方式查看 Map/Reduce,交换性/关联性实际上是有意义的:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多