设为首页 收藏本站
查看: 968|回复: 0

[经验分享] Hadoop学习笔记(三):Combiner funcitons

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-7-13 08:24:23 | 显示全部楼层 |阅读模式
  很多MapReduce程序受限于集群上可用的带宽,所以它会尽力最小化需要在map和reduce任务之间传输的中间数据。Hadoop允许用户声明一个combiner function来处理map的输出,同时把自己对map的处理结果作为reduce的输入。因为combiner function本身只是一种优化,hadoop并不保证对于某个map输出,这个方法会被调用多少次。换句话说,不管combiner function被调用多少次,对应的reduce输出结果都应该是一样的。
  下面我们以学习笔记(一)中的例子来加以说明,假设1950年的天气数据读取是由两个map完成的,其中第一个map的输出如下: 
  (1950, 0)
  (1950, 20)
  (1950, 10)
  第二个map的输出为:
(1950, 25)
(1950, 15)
  而reduce得到的输入为:(1950, [0, 20, 10, 25, 15]), 输出为:(1950, 25)
  由于25是集合中的最大值,我们可以使用一个类似于reduce function的combiner function来找出每个map输出中的最大值,这样的话,reduce的输入就变成了:
  (1950, [20, 25])
  各个funciton 对温度值的处理过程可以表示如下:max(0, 20, 10, 25, 15) = max(max(0, 20, 10), max(25, 15)) = max(20, 25) = 25
  注意:并不是所有的函数都拥有这个属性的(有这个属性的函数我们称之为commutative和associative),例如,如果我们要计算平均温度,就不能这样使用combiner function,因为mean(0, 20, 10, 25, 15) = 14,而mean(mean(0, 20, 10), mean(25, 15)) = mean(10, 20) = 15
  combiner function并不能取代reduce function(因为仍然需要reduce function处理来自不同map的带有相同key的记录)。但是他可以帮助减少需要在map和reduce之间传输的数据,就为这一点combiner function就值得考虑使用。

  声明combiner function
  现在我们回到学习笔记(一)中的mapreduce程序,对于这个程序来说,combiner的实现同reducer 的实现是一样的,唯一的改变就是在Job中设置一下Combiner的具体实现类(也就是reducer类,代码见下面下划线部分)。  



1 public class MaxTemperatureWithCombiner {
2   public static void main(String[] args) throws Exception {
3     if (args.length != 2) {
4        System.err.println("Usage: MaxTemperatureWithCombiner  " +
5              "");
6        System.exit(-1);
7     }
8     Job job = new Job();
9     job.setJarByClass(MaxTemperatureWithCombiner.class);
10     job.setJobName("Max temperature");
11
12     FileInputFormat.addInputPath(job, new Path(args[0]));
13     FileOutputFormat.setOutputPath(job, new Path(args[1]));
14
15     job.setMapperClass(MaxTemperatureMapper.class);
16     job.setCombinerClass(MaxTemperatureReducer.class);
17     job.setReducerClass(MaxTemperatureReducer.class);
18
19     job.setOutputKeyClass(Text.class);
20     job.setOutputValueClass(IntWritable.class);
21
22     System.exit(job.waitForCompletion(true) ? 0 : 1);
23   }
24 }
  转载请注明出处:http://www.iyunv.com/beanmoon/archive/2012/12/09/2805684.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85933-1-1.html 上篇帖子: Hadoop 配置-启动 过程中遇到的问题 下篇帖子: html调用hadoop WebHDFS REST API
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表