Hadoop Combiner使用方法详解

 更新时间:2017年10月25日 10:16:34   作者:csguo007  
这篇文章主要介绍了 Hadoop 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的输出结果是否一样?

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

相关文章

  • Spring注解驱动之ApplicationListener异步处理事件说明

    Spring注解驱动之ApplicationListener异步处理事件说明

    这篇文章主要介绍了Spring注解驱动之ApplicationListener异步处理事件说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Spring-boot 2.3.x源码基于Gradle编译过程详解

    Spring-boot 2.3.x源码基于Gradle编译过程详解

    这篇文章主要介绍了Spring-boot 2.3.x源码基于Gradle编译过程详解,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • SpringBoot中打war包需要注意事项

    SpringBoot中打war包需要注意事项

    这篇文章主要介绍了SpringBoot中打war包需要注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java 多线程之两步掌握

    Java 多线程之两步掌握

    Java 多线程编程 Java给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务
    2021-10-10
  • Java实现简单棋盘存档和读取功能

    Java实现简单棋盘存档和读取功能

    这篇文章主要为大家详细介绍了Java实现简单棋盘存档和读取功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • 分享一个你不知道的Java异常实现的缺陷

    分享一个你不知道的Java异常实现的缺陷

    Java中一个大家熟知的知识点就是异常捕获,try...catch...finally组合,但是很多人不知道这里面有一个关于Java的缺陷,或者说是异常实现的一点不足之处。本文就通过一个很简单的实验给大家演示下效果玩玩儿,希望大家能觉得有趣
    2022-12-12
  • maven的pom文件与打包详解

    maven的pom文件与打包详解

    pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。本文详细的介绍了pom文件配置,感兴趣的可以了解一下
    2021-08-08
  • 详解MyBatis Plus中分页插件的使用

    详解MyBatis Plus中分页插件的使用

    这篇文章主要为大家详细介绍了MyBatis Plus中分页插件使用的相关知识,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-02-02
  • Springboot基于maven打包分离lib及resource

    Springboot基于maven打包分离lib及resource

    这篇文章主要介绍了Springboot基于maven打包分离lib及resource,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java中使用COS实现文件上传功能

    Java中使用COS实现文件上传功能

    cos是O'Rrilly公司开发的一款用于HTTP上传文件的OpenSource组件。下面通过本文给大家分享使用COS实现文件上传功能,感兴趣的朋友一起看看吧
    2017-08-08

最新评论