1.Combiner功能是:合并汇总(shuffle中的组件)
1)combiner是MR程序中Mapper和Reducer之外的一种组件。
2)combiner组件的父类就是Reducer,也就是说combiner是继承之reducer的,相当于reducer
3)combiner和reducer的区别在于运行的位置:Combiner是在每一个maptask所在的节点运行,然后Reducer是接收全局所有Mapper的输出结果,也就是说 combiner函数的输出作为reducer的输入。
4)combiner的意义 就是对每一个maptask的输出进行局部汇总,以减小网络传输量, 属于优化方案。

2.注意Combiner的使用要非常谨慎:
      因为combiner在mapreduce过程中可能调用也肯能不调用,可能调一次也可能调多次,无法确定和控制
      所以,combiner使用的原则是:有或没有都不能影响业务逻辑,使不使用combiner都不能影响最终reducer的结果。而且, combiner的输出kv应该跟reducer的输入kv类型要对应起来。因为有时使用combiner不当的话会对统计结果造成错误的结局,还不如不用。比如对所有数求平均数:
    Mapper端使用combiner
         3 5 7 ->(3+5+7)/3=5
         2 6 ->(2+6)/2=4
    Reducer
          (5+4)/2=9/2  不等于(3+5+7+2+6)/5=23/5
3.combiner既然可以汇总,能不能用combiner取代reduce函数?(面试题)

虽然combiner可以帮我们减少mapper和reducer之间的数据传输量,对mapper到reducer的数据进行局部汇总,减轻reducer的工作量和减少网络IO,但是我们仍然需要用reduce函数来处理不同map输出的具有相同键的记录。

4. 使用自定义Combiner实现步骤

( 1 )自定义一个 combiner 继承 Reducer ,重写 reduce 方法,以经典的wordcount为例
public class WordcountCombiner extends Reducer<Text, IntWritable, Text, IntWritable>{
       @Override
       protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
              int count = 0;
              for(IntWritable v :values){
//对同一个map输出的k,v对进行按k进行一次汇总。不同map的k,v汇总必须要用reduce方法
                     count += v.get();
              }
              context.write(key, new IntWritable(count));
       }
}
(2)在job中设置:  job.setCombinerClass(WordcountCombiner.class);

方案二:前提是combiner和reduce方法功能一样,可以不用定义combiner,直接使用reduce当combiner.
        将WordcountReducer作为combiner在WordcountDriver驱动类中指定
         job.setCombinerClass(WordcountReducer.class);

combiner函数的使用注意事项和代码演示相关推荐

  1. 【Groovy】Groovy 动态语言特性 ( Groovy 中函数实参自动类型推断 | 函数动态参数注意事项 )

    文章目录 前言 一.Groovy 中函数实参自动类型推断 二.函数动态参数注意事项 三.完整代码示例 前言 Groovy 是动态语言 , Java 是静态语言 ; 本篇博客讨论 Groovy 中 , ...

  2. 关于使用fgetc函数和feof函数的一些注意事项

    关于使用fgetc函数和feof函数的一些注意事项 众所周知,文件分为二进制文件和文本文件,它们在磁盘中的存储方式是相同的,都是二进制存储,但是它们的读取方式不同.对于文本文件,我们通常使用逐个字节读 ...

  3. DL之Keras:keras保存网络结构、网络拓扑图、网络模型(json、yaml、h5等)注意事项及代码实现

    DL之Keras:keras保存网络结构.网络拓扑图.网络模型(json.yaml.h5等)注意事项及代码实现 目录 keras保存网络结构.网络拓扑图.网络模型(json.yaml.h5等)注意事项 ...

  4. 单片机sleep函数的头文件_单片机代码模块化设计思想浅谈

    前言:前段时间分享的文章[单片机裸机代码框架设计思路],很多读者给我留言,觉得很不错,对于初学者而言,这是一个进阶的技巧,对于我而言,这是对自己总结和表达能力的一个提升. 本文章我们再谈谈单片机代码的 ...

  5. python实现采样函数_python中resample函数实现重采样和降采样代码

    函数原型 resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='s ...

  6. linux下的fgetc()与fputc()函数详细介绍及代码演示

    linux下的标准I/O的fgetc()与fputc()函数详细介绍及代码演示 文章目录 前言 一.fgetc()用法介绍 二.fputc()用法介绍 代码演示 总结 前言 在C语言中,读写文件比较灵 ...

  7. c语言goord函数,php的chr和ord函数实现字符加减乘除运算实现代码

    php的chr和ord函数实现字符加减乘除运算实现代码 chr函数用于将ASCII码转换为字符 ord函数是用来字符转换为ASCII码 ASCII码是计算机所能显示字符的编码,它的取值范围是0-255 ...

  8. html视频一直播放代码,通过HTML5调用播放视频的一些注意事项和代码方法

    在这个有关视频的快速技巧里,我们将探讨如何在项目中使用 HTML5 video 标签.由于旧的浏览器和 Internet Explorer 不支持 元素,我们必须为这些浏览器找到一个支持 Flash ...

  9. java split函数的用法_java中split函数用法以及注意事项

    java中split函数用法以及注意事项 发布时间:2020-04-23 10:28:23 来源:亿速云 阅读:215 作者:小新 本篇文章和大家了解一下java中split函数用法以及注意事项.有一 ...

最新文章

  1. node.js和npm版本升级及升级过程中遇到的问题和解决方案
  2. xpath定位中starts-with、contains和text()的用法
  3. QT5快速转换路径(/斜杠与\反斜杠转换)
  4. bootstrap 点击按钮刷新_Spring Cloud 中的 Bootstrap 上下文
  5. C++_类和对象_C++运算符重载_关系运算符重载_对== !=重载实现对象的对比_---C++语言工作笔记059
  6. 使用git checkout的方式进行轻量级部署
  7. url后面的参数是什么_揭秘亚马逊黑科技之超级URL原理
  8. 二、Kubernetes (k8s) 内网集群的搭建详细图解
  9. Python连接SQL Server 之pyodbc
  10. 什么是dataSource 对数据源的简单理解。
  11. 我只用了3步,实现了一个逼真的3D场景渲染
  12. html+css+支付宝页面,HTML+CSS+JS简单实现支付宝付款界面效果
  13. Java类和对象之对象组合之求圆柱体积
  14. java解压7z格式的压缩包
  15. SPRD Camera sensor
  16. 密码学和计算机安全学科方向排名
  17. windows远程桌面功能和粘贴拷贝功能
  18. 新版TOMTOM导航仪破解指南
  19. 【acwing】游戏时间2理解
  20. keil建立stm32工程即标准库函数目录结构

热门文章

  1. 人工智能 计算机科学的一个分支,人工智能,计算机科学的一个分支?
  2. NPOI读取自定义的颜色bug修复方案
  3. 加仓减仓口诀_加仓减仓的最佳方法:金字塔法则!
  4. IBM实习生笔试题目(2)
  5. Linux中的进程管理类、ps 查看当前系统进程状态、内存置换算法LRU、查看与sshd相关进程
  6. c语言中的编程英文怎么看,在C语言中使用英文字符
  7. LS1046A 调试记录
  8. 【BA TSP】基于matlab蜜蜂算法求解旅行商问题【含matlab源码 1248期】
  9. ajax 代码 查询股票联想,Ajax-hook获取秒级股票详细数据
  10. 花式宠妈:这个母亲节,带妈妈逛银泰