代码之家  ›  专栏  ›  技术社区  ›  user3692015

在mapreduce中,合并器如何更改结果?[副本]

  •  0
  • user3692015  · 技术社区  · 7 年前

    组合器在映射器之后和还原器之前运行,它将接收给定节点上映射器实例发出的所有数据作为输入。然后将输出发送到减速器。

    而且,如果reduce函数是

    交换结合

    0 回复  |  直到 12 年前
        1
  •  29
  •   Donald Miner    13 年前

    假设你有一个数字列表,123456。

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

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

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

    交换意味着顺序不重要,所以:

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

    例如,如前所示,加法适合此属性。“max”也适用于上述属性,因为max的max是max.max(a,b)=max(b,a)。

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


        2
  •  10
  •   Charles Menguy jdw6415    13 年前

    对于交换性,假设你的减速机可以用一个称为f()的函数(用数学术语)来表示。如果f(a,b)=f(b,a),那么你的减速机是可交换的

    • 总和(A,B)与总和(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)相同

    因此,在Map/Reduce的上下文中,您的reducer必须尊重这两个属性。例如,如果减速器只执行sum()或max(),则它同时考虑这两个属性,但mean()或median()之类的属性则不考虑这两个属性,因此不能将其用作组合器。

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

    enter image description here

    推荐文章