mapreduce作业中的“Combiner”类

时间:2012-04-19 01:19:22

标签: hadoop mapreduce reducers combiners

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

此外,如果reduce函数同时是 可交换和关联 ,那么它可以用作组合器。

我的问题是“ 交换和关联 ”这句话在这种情况下是什么意思?

2 个答案:

答案 0 :(得分:28)

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

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

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

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

交换意味着订单无关紧要,所以:

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

例如,添加,适合此属性,如前所述。 “Maximum”也符合上述属性,因为maxs的最大值是max。 max(a,b)== max(b,a)。

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


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

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

答案 1 :(得分:10)

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

  • 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()这样的东西却没有,因此你不能将它用作组合器。 / p>

我个人认为组合器是在地图阶段之后在内存中运行的迷你减速器,作为减少网络流量的优化,如果你看到Map / Reduce这种方式,交换性/关联性实际上是有意义的:

enter image description here