MapReduce程序开发中的Combiner
2016-04-04 11:33
288 查看
2016年4月4日10:46:2
MapReduce程序开发中的Combiner
作者:数据分析玩家
在MapReduce程序的运行过程中,经过shuffle阶段:分区、排序、分组之后,可以使用Combiner类进行进一步的处理,但是Combiner这个类究竟是做什么的,其使用的限制条件究竟是什么,本文将对Combiner类进行全面的阐述。
假设在WordCount程序中,我们读取的文件内容为:
hello you
hello me
如果在MapReduce程序中,我们不加入 job.setCombinerClass(MyCombiner.class);即不使用Combiner这个类,程序运行完之后,显示的计数器为:
Map-Reduce Framework
Map input records=2
Map output records=4
Reduce input records=4
Reduce input groups=3
Map output records=4
这是我们在不加入Combiner这个类时显示的计数器,可以看出Mapper任务传送给Reducer任务的组数是3,记录数是4
当我们在MapReduce加入job.setCombinerClass(MyCombiner.class)这一行代码时,程序运行完之后,显示的计数器情况为:
Map-Reduce Framework
Map input records=2
Map output records=4
Reduce input records=3
Reduce input groups=3
Map output records=4
当我们在加入Combiner这个类之后,可以看出Mapper任务传送给Reducer任务的组数是3,记录数是3,相比与之前的情况,我们发现记录数少了1个,这又是为什么呢?这个问题正好可以说明我们Combiner类的作用:Combiner这个类发生在每一个Mapper任务的内部,在每一个Mapper任务的内部对每一个键值对<k2,v2s>先进行一次合并,将大的数据集合变成小的数据集合,也就是说本来一个Mapper任务处理之后传送给Reducer任务的应该是键值对<hello,{1,1}>,但是由于Combiner这个类先进行了一次的合并,传送给Reducer任务的数据变成了<hello,2>,因此记录数减少了1个。
通过实例运行之后,我们从以下几个方面对归约即Combiner类的作用进行阐述:
1>为什么要使用Combiner,Combiner所起的作用是什么?
Combiner最基本的作用是实现本地key的归并,combiner具有类似本地Reducer的功能.
Combiner发生在每一个Mapper任务的末尾端,对数据进行规约处理,对输出的数据先做一次合并,进而传送到Reducer任务的数据量变小了,传输时间变短,作业的整体时间变短.
图示如下:
2>combiner归约使用的限制条件是什么?
只有当<k2,v2>的数据类型与<k3,v3>的数据类型完全相同的时候,才能够在MapReduce程序中加入归约这个步骤,例如:在WordCount程序中,<k2,v2>的数据类型是<Text,LongWritable>而<k3,v3>的数据类型也是
<Text,LongWritable>,所以本程序可以使用Combiner这个步骤
3>如何使用combiner这个类?
在程序中加入job.setCombinerClass(MyReducer.class)这行代码即可。
2016年4月4日11:32:20
MapReduce程序开发中的Combiner
作者:数据分析玩家
在MapReduce程序的运行过程中,经过shuffle阶段:分区、排序、分组之后,可以使用Combiner类进行进一步的处理,但是Combiner这个类究竟是做什么的,其使用的限制条件究竟是什么,本文将对Combiner类进行全面的阐述。
假设在WordCount程序中,我们读取的文件内容为:
hello you
hello me
如果在MapReduce程序中,我们不加入 job.setCombinerClass(MyCombiner.class);即不使用Combiner这个类,程序运行完之后,显示的计数器为:
Map-Reduce Framework
Map input records=2
Map output records=4
Reduce input records=4
Reduce input groups=3
Map output records=4
这是我们在不加入Combiner这个类时显示的计数器,可以看出Mapper任务传送给Reducer任务的组数是3,记录数是4
当我们在MapReduce加入job.setCombinerClass(MyCombiner.class)这一行代码时,程序运行完之后,显示的计数器情况为:
Map-Reduce Framework
Map input records=2
Map output records=4
Reduce input records=3
Reduce input groups=3
Map output records=4
当我们在加入Combiner这个类之后,可以看出Mapper任务传送给Reducer任务的组数是3,记录数是3,相比与之前的情况,我们发现记录数少了1个,这又是为什么呢?这个问题正好可以说明我们Combiner类的作用:Combiner这个类发生在每一个Mapper任务的内部,在每一个Mapper任务的内部对每一个键值对<k2,v2s>先进行一次合并,将大的数据集合变成小的数据集合,也就是说本来一个Mapper任务处理之后传送给Reducer任务的应该是键值对<hello,{1,1}>,但是由于Combiner这个类先进行了一次的合并,传送给Reducer任务的数据变成了<hello,2>,因此记录数减少了1个。
通过实例运行之后,我们从以下几个方面对归约即Combiner类的作用进行阐述:
1>为什么要使用Combiner,Combiner所起的作用是什么?
Combiner最基本的作用是实现本地key的归并,combiner具有类似本地Reducer的功能.
Combiner发生在每一个Mapper任务的末尾端,对数据进行规约处理,对输出的数据先做一次合并,进而传送到Reducer任务的数据量变小了,传输时间变短,作业的整体时间变短.
图示如下:
2>combiner归约使用的限制条件是什么?
只有当<k2,v2>的数据类型与<k3,v3>的数据类型完全相同的时候,才能够在MapReduce程序中加入归约这个步骤,例如:在WordCount程序中,<k2,v2>的数据类型是<Text,LongWritable>而<k3,v3>的数据类型也是
<Text,LongWritable>,所以本程序可以使用Combiner这个步骤
3>如何使用combiner这个类?
在程序中加入job.setCombinerClass(MyReducer.class)这行代码即可。
2016年4月4日11:32:20
相关文章推荐
- aop注解
- Oracle数据库内置函数
- akka actor学习材料(引用)
- Linux下安装ActiveMQ CPP
- myeclipse和svn通过代理方式更新代码
- aop
- js拖拽的原型声明和用法总结
- HDOJ 1431-素数回文【删除大量无关数据】
- 共同学习Java源码--常用数据类型--String(八)
- 赶集网mysql开发36军规
- spring笔记
- Android:自定义标题栏
- 设计模式C++迭代器模式
- matlab图像边缘检测
- High Performance之android高性能之路
- spring整合和事物策略
- IT忍者神龟之 oracle行转列、列转行
- 在APP中两个业务都需要支付,但一个ping++应用只有一个webhook
- C++ 类对象的内存分配
- js设计模式-享元模式