有些运算,如中值和均值,是非交换的。在这种情况下,似乎只能有一个reducer,因为reducer需要具有全局视图。map reduce中有没有可以并行执行的非交换的reduce?当遇到非交换操作时,人们真的使用map reduce吗?或者只是在一台非常强大的机器上运行?有没有常用的方法将非交换运算分解为交换运算?谢谢
hwazgwia1#
我不知道“交换”这个词在这里用得对不对,但我明白你的意思。在hadoop中,Map后阶段实际上分为两个步骤: Combiner 和一个 Reducer ,签名相同。这个 Combiner 在Map器上运行以减小输出的大小,然后再对其进行键排序并将其发送给还原器。如果你只指定一个 Reducer ,则两者都使用;但你可以把它们分开,让它们比你想象的要多得多。进行计数操作的简单情况使用计数减速机,该减速机可用于合并步骤和减速机步骤。这样就减少了同一个密钥通过导线多次发送的需要。通过定义不同的合并器和归约器,您可以获得计算平均值的类似效率。例如,Map器输出一个值 (number, 1) 对应于数值和计数1。组合器可以将值集合Map到 (sum, count) 元组或 (mean, count) 元组,并且reducer可以使用计数的权重来聚合这些值,从而生成平均值(顺便提一下:使用kahan求和法(summation)可以大大减少添加大量数字的错误。这使得Map者可以像在一个简单的计数示例中那样进行一些组合。你可以在一个Map缩小步骤中做很多聪明的事情。然而,我不认为这是可能的中位数;在这种情况下,你实际上必须通过一台机器的状态发送所有的数字。
Combiner
Reducer
(number, 1)
(sum, count)
(mean, count)
1条答案
按热度按时间hwazgwia1#
我不知道“交换”这个词在这里用得对不对,但我明白你的意思。
在hadoop中,Map后阶段实际上分为两个步骤:
Combiner
和一个Reducer
,签名相同。这个Combiner
在Map器上运行以减小输出的大小,然后再对其进行键排序并将其发送给还原器。如果你只指定一个Reducer
,则两者都使用;但你可以把它们分开,让它们比你想象的要多得多。进行计数操作的简单情况使用计数减速机,该减速机可用于合并步骤和减速机步骤。这样就减少了同一个密钥通过导线多次发送的需要。
通过定义不同的合并器和归约器,您可以获得计算平均值的类似效率。例如,Map器输出一个值
(number, 1)
对应于数值和计数1。组合器可以将值集合Map到(sum, count)
元组或(mean, count)
元组,并且reducer可以使用计数的权重来聚合这些值,从而生成平均值(顺便提一下:使用kahan求和法(summation)可以大大减少添加大量数字的错误。这使得Map者可以像在一个简单的计数示例中那样进行一些组合。你可以在一个Map缩小步骤中做很多聪明的事情。然而,我不认为这是可能的中位数;在这种情况下,你实际上必须通过一台机器的状态发送所有的数字。