Hadoop学习之路(十八)MapReduce框架Combiner分区
对combiner的理解
combiner其实属于优化方案,由于带宽限制,应该尽量map和reduce之间的数据传输数量。它在Map端把同一个key的键值对合并在一起并计算,计算规则与reduce一致,所以combiner也可以看作特殊的Reducer。
执行combiner操作要求开发者必须在程序中设置了combiner(程序中通过job.setCombinerClass(myCombine.class)自定义combiner操作)。
Combiner组件是用来做局部汇总的,就在mapTask中进行汇总;Reducer组件是用来做全局汇总的,最终的,最后一次汇总。
哪里使用combiner?
1,map输出数据根据分区排序完成后,在写入文件之前会执行一次combine操作(前提是作业中设置了这个操作);
2,如果map输出比较大,溢出文件个数大于3(此值可以通过属性min.num.spills.for.combine配置)时,在merge的过程(多个spill文件合并为一个大文件)中前还会执行combiner操作;
注意事项
不是每种作业都可以做combiner操作的,只有满足以下条件才可以:
1、Combiner 只能对 一个mapTask的中间结果进行汇总
2、如果想使用Reducer直接充当Combiner,那么必须满足: Reducer的输入和输出key-value类型是一致的。
1)处于两个不同节点的mapTask的结果不能combiner到一起
2)处于同一个节点的两个MapTask的结果不能否combiner到一起
3)求最大值、求最小值、求和、去重时可直接使用Reducer充当Combiner,但是求平均值时不能直接使用Reducer充当Combiner。
原因:对2组值求平均值
2 3 4 5 6 == 20 / 5 == 4
4 5 6 == 15 / 3 == 5
***********************************************************************
20+15 / 5+3 = 35 / 8
4.5
最新文章
- SharePoint 部署时报错: 未能提取此解决方案中的cab文件
- 金融IC卡 ARQC和ARPC计算方法和实例(转)
- The template engine
- C++之路起航——标准模板库(vector)
- linux 下 `dirname $0`
- java程序执行顺序
- Fetch的使用
- MyEclipse保存文件时 自动格式化代码! 不包括文档注释
- Android有效解决加载大图片时内存溢出的问题
- sublime text 安装 SFTP
- 对比requirejs更好的理解seajs
- c运行时函数参考学习地址
- 微信for linux
- mongodb与java整合
- Maven项目pom.xml文件简单解析
- 使用sysbench 0.5 对mysql 进行性能、压力测试
- (备忘)打开office2010总是在配置进度
- postman(五):在不同接口之间传递数据
- ElasticSearch入门 第一篇:Windows下安装ElasticSearch
- 一个生产可用的mysql参数文件my.cnf