深入了解Combiners编程(相当于Map端的Reduce)

  • 每一个map可能会产生大量的输出,combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量。
  • combiner最基本是实现本地key的归并,combiner具有类似本地的reduce功能。
  • 如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下。使用combiner,先完成的map会在本地聚合,提升速度。
  • 注意:Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。
  • 所以,Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。

在程序中仅需要在主函数中添加如下代码:

  1. //规约的例子,足以
  2. job.setCombinerClass(MyReducer.class);

其中:MyReducer为自定的Reducer任务。

以单词技术为例:

(1)在没有Combine情况下

输入2个键值对<0,hello you><10,hello me>

map端产生4个键值对<k2,v2>,<hello,1><you,1><hello,1><me,1>

3个分组,<hello,{1,1}><me,{1}><you,{1}>

传输到reduce有3个键值对<hello,{2}><me,{1}><you,{1}>,3个分组

-----------------

hello you

hello  me

-----------------

(2)有Combine的情况

输入2个键值对<0,hello you><10,hello me>

map端产生4个键值对<k2,v2>,<hello,1><you,1><hello,1><me,1>

Combine输入键值对有4个 <hello,1><you,1><hello,1><me,1>

Combine输出键值对有三个<hello,{1,1}><me,{1}><you,{1}>

3个分组,<hello,{1,1}><me,{1}><you,{1}>

传输到reduce有3个键值对<hello,{2}><me,{1}><you,{1}>,3个分组

测试代码:

  1. package Mapreduce;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.fs.Path;
  7. import org.apache.hadoop.io.LongWritable;
  8. import org.apache.hadoop.io.Text;
  9. import org.apache.hadoop.mapreduce.Job;
  10. import org.apache.hadoop.mapreduce.Mapper;
  11. import org.apache.hadoop.mapreduce.Reducer;
  12. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  13. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  14. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  15. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  16.  
  17. /**
  18. * 规约:Combiner
  19. *
  20. */
  21. public class CombinerTest {
  22. public static void main(String[] args) throws Exception {
  23. //必须要传递的是自定的mapper和reducer的类,输入输出的路径必须指定,输出的类型<k3,v3>必须指定
  24. //2将自定义的MyMapper和MyReducer组装在一起
  25. Configuration conf=new Configuration();
  26. String jobName=CombinerTest.class.getSimpleName();
  27. //1首先寫job,知道需要conf和jobname在去創建即可
  28. Job job = Job.getInstance(conf, jobName);
  29.  
  30. //*13最后,如果要打包运行改程序,则需要调用如下行
  31. job.setJarByClass(CombinerTest.class);
  32.  
  33. //3读取HDFS內容:FileInputFormat在mapreduce.lib包下
  34. FileInputFormat.setInputPaths(job, new Path("hdfs://neusoft-master:9000/data/hellodemo"));
  35. //4指定解析<k1,v1>的类(谁来解析键值对)
  36. //*指定解析的类可以省略不写,因为设置解析类默认的就是TextInputFormat.class
  37. job.setInputFormatClass(TextInputFormat.class);
  38. //5指定自定义mapper类
  39. job.setMapperClass(MyMapper.class);
  40. //6指定map输出的key2的类型和value2的类型 <k2,v2>
  41. //*下面两步可以省略,当<k3,v3>和<k2,v2>类型一致的时候,<k2,v2>类型可以不指定
  42. job.setMapOutputKeyClass(Text.class);
  43. job.setMapOutputValueClass(LongWritable.class);
  44. //7分区(默认1个),排序,分组,规约 采用 默认
  45.  
  46. //规约的例子
  47. job.setCombinerClass(MyReducer.class);
  48. //接下来采用reduce步骤
  49. //8指定自定义的reduce类
  50. job.setReducerClass(MyReducer.class);
  51. //9指定输出的<k3,v3>类型
  52. job.setOutputKeyClass(Text.class);
  53. job.setOutputValueClass(LongWritable.class);
  54. //10指定输出<K3,V3>的类
  55. //*下面这一步可以省
  56. job.setOutputFormatClass(TextOutputFormat.class);
  57. //11指定输出路径
  58. FileOutputFormat.setOutputPath(job, new Path("hdfs://neusoft-master:9000/out1"));
  59.  
  60. //12写的mapreduce程序要交给resource manager运行
  61. job.waitForCompletion(true);
  62. }
  63. private static class MyMapper extends Mapper<LongWritable, Text, Text,LongWritable>{
  64. Text k2 = new Text();
  65. LongWritable v2 = new LongWritable();
  66. @Override
  67. protected void map(LongWritable key, Text value,//三个参数
  68. Mapper<LongWritable, Text, Text, LongWritable>.Context context)
  69. throws IOException, InterruptedException {
  70. String line = value.toString();
  71. String[] splited = line.split("\t");//因为split方法属于string字符的方法,首先应该转化为string类型在使用
  72. for (String word : splited) {
  73. //word表示每一行中每个单词
  74. //对K2和V2赋值
  75. k2.set(word);
  76. v2.set(1L);
  77. context.write(k2, v2);
  78. }
  79. }
  80. }
  81. private static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable> {
  82. LongWritable v3 = new LongWritable();
  83. @Override //k2表示单词,v2s表示不同单词出现的次数,需要对v2s进行迭代
  84. protected void reduce(Text k2, Iterable<LongWritable> v2s, //三个参数
  85. Reducer<Text, LongWritable, Text, LongWritable>.Context context)
  86. throws IOException, InterruptedException {
  87. long sum =0;
  88. for (LongWritable v2 : v2s) {
  89. //LongWritable本身是hadoop类型,sum是java类型
  90. //首先将LongWritable转化为字符串,利用get方法
  91. sum+=v2.get();
  92. }
  93. v3.set(sum);
  94. //将k2,v3写出去
  95. context.write(k2, v3);
  96. }
  97. }
  98. }

Combine测试代码

[root@neusoft-master filecontent]# hadoop dfs -rm -R /out1

[root@neusoft-master filecontent]# hadoop jar CombineTest.jar

Map-Reduce Framework

Map input records=2
Map output records=4
Map output bytes=51
Map output materialized bytes=49
Input split bytes=106
Combine input records=4
Combine output records=3
Reduce input groups=3
Reduce shuffle bytes=49
Reduce input records=3
Reduce output records=3
Spilled Records=6
Shuffled Maps =1
Failed Shuffles=0
Merged Map outputs=1
GC time elapsed (ms)=53
CPU time spent (ms)=1760
Physical memory (bytes) snapshot=455901184
Virtual memory (bytes) snapshot=3118538752

使用Combiner有什么好处?

在map端执行reduce操作,可以减少map最终的数据量,减少传输到reduce的数据量,减少网络带宽。

为什么Combiner不是默认配置?

因为有的算法不适合Combiner

什么算法不适合Combiner?

不符合幂等性的算法,比如在网络传输时候出现故障,多次执行程序结果是不同的

如:求平均值的算法。

2 2 2  这三个数在一个文件中

1 1 1 1   这四个数在一个文件中

两个文件产生2个inputsplit,每一个inputsplit对应一个mao任务,产生2个mapper任务,如果求平均数,真实值(2+2+2+1+1+1+1)/7=1.4

如果使用Combiner,map端要做一次Reduce,第一个文件平均数为2,第二个文件的平均数为1,之后再reduce再求平均值得到1.5,值不正确。

为什么在map端执行了reduce操作,还需要在reduce端再次执行哪?
      答:因为map端执行的是局部reduce操作,在reduce端执行全局reduce操作。(上述例子中,map端仅仅指定的是单个文件的合并,reduce端执行的是两个文件的合并)

MapReduce规约的更多相关文章

  1. 第2节 mapreduce深入学习:7、MapReduce的规约过程combiner

    第2节 mapreduce深入学习:7.MapReduce的规约过程combiner 每一个 map 都可能会产生大量的本地输出,Combiner 的作用就是对 map 端的输出先做一次合并,以减少在 ...

  2. Mapreduce之排序&规约&实战案例

    MapReduce 排序和序列化 简单介绍 ①序列化 (Serialization) 是指把结构化对象转化为字节流②反序列化 (Deserialization) 是序列化的逆过程. 把字节流转为结构化 ...

  3. MapReduce中Combiner规约的作用以及不能作为MR标配的原因

    作用:在Mapper端对数据进行Combine归约处理,Combine业务逻辑与Reducer端做的完全相同.处理后的数据再传送到Reducer端,再做一次归约.这样的好处是减少了网络传输的数量.在M ...

  4. [MapReduce] Google三驾马车:GFS、MapReduce和Bigtable

    声明:此文转载自博客开发团队的博客,尊重原创工作.该文适合学分布式系统之前,作为背景介绍来读. 谈到分布式系统,就不得不提Google的三驾马车:Google FS[1],MapReduce[2],B ...

  5. Hadoop日记Day17---计数器、map规约、分区学习

    一.Hadoop计数器 1.1 什么是Hadoop计数器 Haoop是处理大数据的,不适合处理小数据,有些大数据问题是小数据程序是处理不了的,他是一个高延迟的任务,有时处理一个大数据需要花费好几个小时 ...

  6. 用Map-Reduce的思维处理数据

    在很多人的眼里,Map-Reduce等于Hadoop,没有Hadoop谈Map-Reduce犹如自上谈兵,实则不然,Map-Reduce是一种计算模型,只是非常适合在并行的环境下运行,Hadoop是M ...

  7. MapReduce介绍

    一.MapReduce模型 1.MapReduce是大规模数据(TB级)计算的利器,Map和Reduce是它的主要思想,来源于函数式编程语言. 2.Map负责将数据打散,Reduce负责对数据进行聚集 ...

  8. MapReduce Shuffle原理 与 Spark Shuffle原理

    MapReduce的Shuffle过程介绍 Shuffle的本义是洗牌.混洗,把一组有一定规则的数据尽量转换成一组无规则的数据,越随机越好.MapReduce中的Shuffle更像是洗牌的逆过程,把一 ...

  9. Hadoop 1.0 和 2.0 中的数据处理框架 - MapReduce

    1. MapReduce - 映射.化简编程模型 1.1 MapReduce 的概念 1.1.1 map 和 reduce 1.1.2 shufftle 和 排序 MapReduce 保证每个 red ...

随机推荐

  1. c#系统消息类封装

    今天封装了一个返回json的消息类 using System; using System.Collections.Generic; using System.Linq; using System.Te ...

  2. 禁用ViewPager左右两侧拉到边界的渐变颜色

    Android ViewPager在拖拽到左边和右边的时候,禁止显示黄色或者蓝色的渐变图片的解决方法 先说明哦,想看看院里的,从头开始看,否则,就拉到最下面啦.解决方案就在最下面. 修改前: 修改后: ...

  3. _DataStructure_C_Impl:图的邻接矩阵存储

    //_DataStructure_C_Impl:邻接矩阵 #include<stdio.h> #include<stdlib.h> #include<string.h&g ...

  4. iOS 定时器的比较

    然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资料,大概有三种方法:NSTimer.CADisplayLink.GCD.接下来我就一一介绍它们的用法. 一.NSTimer 1. ...

  5. 【数据分析】Superset 之二 Docker安装初始化

    docker search superset amancevice/superset [] Superset on Debian/Python3 [OK] docker pull amancevice ...

  6. 【代码审计】CLTPHP_v5.5.3 前台任意文件上传漏洞

    0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chichu/ ...

  7. Kafka manager安装 (支持0.10以后版本consumer)

    下载地址:  https://pan.baidu.com/s/1jIE3YL4 步骤: 1. 解压kafka-manager-1.3.2.1.zip 2. cd kafka-manager-1.3.2 ...

  8. 关于array.sort(array,array)

    // 基于第一个 System.Array 中的关键字,使用每个关键字的 System.IComparable 实现,对两个一维 System.Array // 对象(一个包含关键字,另一个包含对应的 ...

  9. SharpGL学习笔记(一) 平台构建与Opengl的hello World

    (一)平台构建与Opengl的hello World OpenGL就是3d绘图的API,微软针和它竞争推出D3D,也就是玩游戏时最常见的DirectorX组件中的3d功能. 所以不要指望windows ...

  10. android studio 引用远程仓库下载慢(JCenter下载慢)的办法

    https://blog.csdn.net/linglingchenchen/article/details/62236723 解决android studio引用远程仓库下载慢(JCenter下载慢 ...