[Hadoop]Reducer总是能复用为Combiner?

简介: Combiner函数是一个可选的中间函数,发生在Map阶段,Mapper执行完成后立即执行。使用Combiner有如下两个优势:Combiner可以用来减少发送到Reducer的数据量,从而提高网络效率。

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

  • Combiner可以用来减少发送到Reducer的数据量,从而提高网络效率。
  • Combiner可以用于减少发送到Reducer的数据量,这将提高Reduce端的效率,因为每个reduce函数将处理相比于未使用Combiner之前更少的记录。

CombinerReducer结构相同,因为CombinerReducer都对Mapper的输出进行处理。这给了我们一个复用Reducer作为Combiner的好机会。但问题是,复用Reducer作为Combiner总是可行的吗?

1. 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作为CombinerMapper 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是没有问题。

2. 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的输出结果是否一样?

3. 区别

Combiner需要实现Reducer接口。Combiner只能用于特定情况。

  • Reducer不同,Combiner有一个约束,Combiner输入/输出键和值类型必须与Mapper的输出键和值类型相匹配。而Reducer只是输入键和值类型与Mapper的输出键和值类型相匹配。
  • Combiner只能用于满足交换律(a.b = b.a)和结合律(a.(b.c)= (a.b).c)的情况。这也意味着Combiner可能只能用于键和值的一个子集或者可能不能使用。
  • Reducer可以从多个Mapper获取数据。Combiner只能从一个Mapper获取其输入。

原文:http://hadoopinrealworld.com/can-reducer-always-be-reused-for-combiner/


目录
相关文章
|
存储 分布式计算 自然语言处理
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
Hadoop序列化、概述、自定义bean对象实现序列化接口(Writable)、序列化案例实操、编写流量统计的Bean对象、编写Mapper类、编写Reducer类、编写Driver驱动类
|
分布式计算 Hadoop 存储
[Hadoop]MapReduce中的Partitioner与Combiner
Partitioners负责划分Maper输出的中间键值对的key,分配中间键值对到不同的Reducer。Maper输出的中间结果交给指定的Partitioner,确保中间结果分发到指定的Reduce任务。
1515 0
|
分布式计算 Hadoop
Hadoop深入学习:Combiner
在本节中,我们着重学习MapReduce编程模型中的Combiner组件。         每一个map都可能会产生大量的本地输出,Combiner的作用就是对map端的输出先做一次合并,以减少在map和reduce节点之间的数据传输量,以提高网络IO性能,是MapReduce的一种优化手段之一。
842 0
|
分布式计算 Hadoop 并行计算
Hadoop里的Partitioner和Combiner两个阶段
<p><span style="font-size:14px">人们对于Mapreduce程序刚开始时都认为只需要一个reduce就够了。毕竟,在你处理数据之前一个reducer已经把数据都分好类了,有谁不喜欢分好类的数据呢。但是这样我们就忽略了并行计算的优势。如果只有一个reducer,我们的云计算就退化成了一个小雨点。</span></p> <p><span style="font-
1609 0
|
14天前
|
存储 分布式计算 Hadoop
大数据处理架构Hadoop
【4月更文挑战第10天】Hadoop是开源的分布式计算框架,核心包括MapReduce和HDFS,用于海量数据的存储和计算。具备高可靠性、高扩展性、高效率和低成本优势,但存在低延迟访问、小文件存储和多用户写入等问题。运行模式有单机、伪分布式和分布式。NameNode管理文件系统,DataNode存储数据并处理请求。Hadoop为大数据处理提供高效可靠的解决方案。
37 2
|
14天前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
16天前
|
SQL 分布式计算 Hadoop
利用Hive与Hadoop构建大数据仓库:从零到一
【4月更文挑战第7天】本文介绍了如何使用Apache Hive与Hadoop构建大数据仓库。Hadoop的HDFS和YARN提供分布式存储和资源管理,而Hive作为基于Hadoop的数据仓库系统,通过HiveQL简化大数据查询。构建过程包括设置Hadoop集群、安装配置Hive、数据导入与管理、查询分析以及ETL与调度。大数据仓库的应用场景包括海量数据存储、离线分析、数据服务化和数据湖构建,为企业决策和创新提供支持。
57 1
|
1月前
|
消息中间件 SQL 分布式计算
大数据Hadoop生态圈体系视频课程
熟悉大数据概念,明确大数据职位都有哪些;熟悉Hadoop生态系统都有哪些组件;学习Hadoop生态环境架构,了解分布式集群优势;动手操作Hbase的例子,成功部署伪分布式集群;动手Hadoop安装和配置部署;动手实操Hive例子实现;动手实现GPS项目的操作;动手实现Kafka消息队列例子等
20 1
大数据Hadoop生态圈体系视频课程

相关实验场景

更多