当前位置: 移动技术网 > IT编程>开发语言>Java > Hadoop Combiner使用方法详解

Hadoop Combiner使用方法详解

2019年07月19日  | 移动技术网IT编程  | 我要评论
hadoop combiner使用方法详解 combiner函数是一个可选的中间函数,发生在map阶段,mapper执行完成后立即执行。使用combiner有如下两个优势

hadoop combiner使用方法详解

combiner函数是一个可选的中间函数,发生在map阶段,mapper执行完成后立即执行。使用combiner有如下两个优势:

  1. combiner可以用来减少发送到reducer的数据量,从而提高网络效率。
  2. combiner可以用于减少发送到reducer的数据量,这将提高reduce端的效率,因为每个reduce函数将处理相对较少记录,相比于未使用combiner之前。

combiner与reducer结构相同,因为combiner和reducer都对mapper的输出进行处理。这给了我们一个复用reducer作为combiner的好机会。但问题是,复用reducer作为combiner总是是一个好主意吗?

特点:

combiners是mapreduce中的一个优化,允许在shuffle和排序阶段之前在本地进行聚合。combiners的首要目标是通过最小化键值对的数量来节省尽可能多的带宽

reducer作为combiner的适用场景

假设我们正在编写一个mapreduce程序来计算股票数据集中每个股票代码的最大收盘价。mapper将数据集中每个股票记录的股票代码作为key和收盘价作为value。reducer然后将循环遍历股票代码对应的所有收盘价,并从收盘价列表中计算最高收盘价。假设mapper 1 处理 股票代码为abc 的3个记录,收盘价分别为50,60和111。让我们假设mapper 2 处理股票代码为abc的2个记录,收盘价分别为100和31。那么reducer将收到股票代码abc五个收盘价---50,60,111,100和31。reducer的工作非常简单,它将简单地循环遍历所有收盘价,并将计算最高收盘价为111。

我们可以在每个mapper之后使用相同的reducer作为combiner。mapper 1 上的combiner将处理3个收盘价格--50,60和111,并且仅输出111,因为它是3个收盘价的最大值。mapper 2 上的combiner将处理2个收盘价格--100和31,并且仅输出100,因为它是2个收盘价的最大值。现在使用combiner之后,reducer仅处理股票代码abc的2个收盘价(原先需要处理5个收盘价),即来自mapper 1 的111和来自mapper 2 的100,并且将从这两个值中计算出最大收盘价格为111。

正如我们看到的,使用combiner情况下reducer输出与没有使用combiner的输出结果是相同的,因此在这种情况下复用reducer作为

combiner是没有问题。

reducer作为combiner的不适用场景

假设我们正在编写一个mapreduce程序来计算股票数据集中每个股票代码的平均交易量(average volume for each symbol)。mapper将数据集中每个股票记录的股票代码作为key和交易量(volume)作为value。reducer然后将循环遍历股票代码对应的所有交易量,并从交易量列表中计算出平均交易量(average volume from the list of volumes for that symbol)。假设mapper 1 处理 股票代码为abc 的3个记录,收盘价分别为50,60和111。让我们假设mapper 2 处理股票代码为abc的2个记录,收盘价分别为100和31。那么reducer将收到股票代码abc五个收盘价---50,60,111,100和31。reducer的工作非常简单,它将简单地循环遍历所有交易量,并将计算出平均交易量为70.4。

50 + 60 + 111 + 100 + 31 / 5 = 352 / 5 = 70.4

让我们看看如果我们在每个mapper之后复用reducer作为combiner会发生什么。mapper 1 上的combiner将处理3个交易量--50,60和111,并计算出三个交易量的平均交易量为73.66。

mapper 2 上的combiner将处理2个交易量--100和31,并计算出两个交易量的平均交易量为65.5。那么在复用reducer作为combiner的情况下,reducer仅处理股票代码abc的2个平均交易量,来自mapper1的73.66 和 来自mapper2的65.5,并计算股票代码abc最终的平均交易量为69.58。

73.66 + 65.5 /2 = 69.58

这与我们不复用reducer作为combiner得出的结果不一样,因此复用reducer作为combiner得出平均交易量是不正确的。

所以我们可以看到reducer不能总是被用于combiner。所以,当你决定复用reducer作为combiner的时候,你需要问自己这样一个问题 - 使用combiner与不使用combiner的输出结果是否一样?

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网