Hadoop3教程(十五):MapReduce中的Combiner

文章目录

  • (103)Combiner概述
    • 什么是Combiner
    • Combiner有什么用处
    • Combiner有什么特点
    • 如何自定义Combiner
  • (104)Combiner合并案例实操
    • 如何从日志里查看Combiner
    • 如果不存在Reduce阶段,会发生什么
    • 自定义Combiner的两种方式
  • 参考文献

(103)Combiner概述

什么是Combiner

Combiner(即合并)是MR里shuffle的一项可选流程,位于Map阶段和Reduce阶段之间,是MR中,除Mapper和Reducer之外的一种组件,但并不是默认存在的组件,其可有也可无。

Combiner有什么用处

主要是用来减少数据量。

比如说在WordCount的案例里,我们可以针对像(a,1)、(a,1)、(a,1)这种完全一样的数据,启用Combiner进行一个简单的聚合,即转换成(a,3)这样的数据。这样做的好处很明显,就是大大减少了输入到Reduce的数据量,以上面例子为例,3条数据直接变成了1条,从而减少了reduce处理的资源压力。

之前大概提过,它的使用场景有两个地方:

第一个场景,是mapper每次溢写到磁盘的时候,每当溢写的时候就可以进行Combiner操作。每个分区内部就开始简单合并。

第二个场景,是在单个MapTask的所有(或部分)的map()都溢写完成后,会有一个归并操作,将所有溢写的文件进行分区归并,待合并完成后,同样可以对每个分区进行一个Combiner操作,减少数据量。

Combiner有什么特点

汇总下Combiner一些特点

  • Combiner的父类是Reducer,即它继承的就是Reducer类;
  • Combiner和Reducer的区别就在于运行的位置,Combiner是在每一个MapTask所在的节点上运行,Reducer是接收所有Mapper的输出;
  • Combiner的意义就是对每一个MapTask(或者说是对自己所在的MapTask)的输出进行局部汇总,以减少网络传输量。
  • 并不是所有的场景都可以使用Combiner,具体区别可以再摸索下,主要是不能影响最终的业务逻辑。

因此,我们可以这么说: Combiner就是运行在一个MapTask上的Reducer,即局部汇总,而真正的Reducer是可以面向所有MapTask的。

另外,如何理解"不能影响最终的业务逻辑"这句话呢?

比如说,当前的业务逻辑是算输入数据的平均值,那我提前对每个MapTask做Combiner,来计算每个MapTask的平均值,然后把结果传给Reducer来计算全部MapTask的平均值,这样子可以吗?

这当然是不行的。

假设两个MapTask,一个接收数字3、5,7,另一个接收数字2和6,分别计算平均值,那就是5和4,再传进Reducer计算平均值:(5+4)/2=4.5。

但是其实(3+5+7+2+6)/5 = 4.6,上面结果算的明显不对。

所以, 是否可以使用Combiner,以及使用什么样的Combiner,都得以不影响最终业务逻辑为前提,不能随便应用。

如何自定义Combiner

如何自定义Combiner?

继承Reducer类,重写Reduce()就可以。

public class WordCountCombiner extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable outV = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable value : values) {sum += value.get();}outV.set(sum);context.write(key,outV);}
}

最后在驱动器里注册:

job.setCombinerClass(WordCountCombiner.class);

(104)Combiner合并案例实操

如何从日志里查看Combiner

如何从打印的日志里来查看Combiner的详情呢?

打印的日志里,有一个Map-Reduce Framework区域,如下图,红色框出来的部分就是combine的运行结果。

combine input records代表输入到Combiner的数据行数,combine output records则表示经过Combiner处理后,输出的数据行数。

下图左边表示未启用自定义Combiner时的输出结果,右边表示启用自定义Combiner后的输出结果。

可以看到,启用前Reduce shuffle bytes是156字节,启用后是66字节,说明数据在传到reduce前经过了自定义Combiner的处理,数据量减小了。

在这里插入图片描述

如果不存在Reduce阶段,会发生什么

如果没有Reduce阶段,就不需要设置Combiner了。

如果我们在驱动类里设置job.setNumReduceTasks(0),即取消Reduce阶段,那么Combiner还会生效么?

答案是不会,Hadoop会将mapper的处理结果作为输出,持久化到文件。以WordCount案例为例,我们最终在文件里看到的就是:

<a,1>
<b,1>
<a,1>
....

为什么会这样呢?

是因为Combiner是存在于Mapper和Reducer之间的shuffle阶段,如果没有reduce的话,那么Reducer阶段不存在,所以整个shuffle阶段也就不存在了,Hadoop会直接将Mapper的处理结果导出。

自定义Combiner的两种方式

还是以WordCount来举例吧。

第一种方式,增加一个WordCountCombiner来继承Reducer,这个上一小节其实讲过了:

package com.atguigu.mapreduce.combiner;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;public class WordCountCombiner extends Reducer<Text, IntWritable, Text, IntWritable> {private IntWritable outV = new IntWritable();@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable value : values) {sum += value.get();}//封装outKVoutV.set(sum);//写出outKVcontext.write(key,outV);}
}

然后在驱动类里声明:

// 指定需要使用combiner,以及用哪个类作为combiner的逻辑
job.setCombinerClass(WordCountCombiner.class);

但是!

实际上如果你看过教程里的代码,会发现,我们自定义的这个Combiner,里面的reduce()跟我们自定义的WordCountReducer类的reduce()一模一样,甚至整个类都是一样的,因为所谓的Combiner就是运行在单个MapTask的Reducer,再加上我们的业务要求,处理逻辑自然完全一致。

所以在这种情况下,我们根本不需要再定义一个Combiner类,直接使用自定义Reducer类来声明就可以。

这就是第二种方案,即我们只需要在驱动类里直接这么写:

// 指定需要使用Combiner,以及用哪个类作为Combiner的逻辑
job.setCombinerClass(WordCountReducer.class);

齐活,简直完美。

参考文献

  1. 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【非root用户、CentOS系统】中使用源码安装gcc/g++的教程

1.引言 系统&#xff1a;CentOS-7.9 显卡驱动版本&#xff1a;460 CUDA Version: 11.2 &#x1f33c;基于本地环境选择安装gcc-10.1.0 &#x1f449; gcc下载网址 2.安装说明 下载好对应的gcc的安装包并解压&#xff1a; 打开gcc-10.1.0/contrib/download_prerequisites&#…

关于gt_sampling的理解

pcdet/datasets/augmentor/data_augmentor.py def gt_sampling(self, configNone):db_sampler database_sampler.DataBaseSampler(root_pathself.root_path,sampler_cfgconfig,class_namesself.class_names,loggerself.logger)return db_sampler此函数指向DataBaseSampler类&a…

0基础学习VR全景平台篇第109篇:认识拼接软件PTGui Pro

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01;今天给大家讲解我们全景后期拼接软件PTgui pro&#xff0c;下面我们开始吧&#xff01; &#xff08;PTgui pro软件课程大纲&#xff09; 1.PTGui这个软件是什么 发明人 &#xf…

【网络编程】从网络编程、TCP/IP开始到BIO、NIO入门知识(未完待续...)

目录 前言前置知识一、计算机网络体系结构二、TCP/IP协议族2.1 简介*2.2 TCP/IP网络传输中的数据2.3 地址和端口号2.4 小总结 三、TCP/UDP特性3.1 TCP特性TCP 3次握手TCP 4次挥手TCP头部结构体 3.2 UDP特性 四、总结 课程内容一、网络通信编程基础知识1.1 什么是Socket1.2 长连…

Python之旅----判断语句

布尔类型和比较运算符 布尔类型 布尔类型的定义 布尔类型的字面量&#xff1a; True 表示真&#xff08;是、肯定&#xff09; False 表示假 &#xff08;否、否定&#xff09; 也就是布尔类型进行判断&#xff0c;只会有2个结果&#xff1a;是或否 定义变量存储布尔类型…

天猫店铺商品评论数据采集,天猫商品评论数据接口,天猫API接口

天猫店铺商品评论数据接口可以获取到商品ID&#xff0c;商品标题&#xff0c;商品优惠券&#xff0c;商品到手价&#xff0c;商品价格&#xff0c;商品优惠价&#xff0c;商品sku属性&#xff0c;商品图片&#xff0c;商品视频&#xff0c;商品sku属性图片&#xff0c;商品属性…

ant中的environment属性

在ant的配置文件中&#xff0c;可以设置属性environment的值&#xff0c;设置的这个值就作为访问环境变量的前缀。例如声明了environment“env”&#xff0c;那么就可以通过env.<环境变量名称>来访问环境变量。 例如创建了一个Java工程&#xff0c;在工程目录下有一个bu…

HCIA --- VLAN实验配置

一、各交换机上配置&#xff1a; 1、各交换机上创建VLAN 2、交换机上的各个接口划分到对应的VLAN中 3、将与交换机、路由器相连的接口创建trunk干道 SW1&#xff1a; [sw1]vlan batch 2 to 3 批量创建VLAN2-3 [sw1]interface Ethernet0/0/1 单独将某个接口划分到对应…

信息保卫战:揭秘迅软DSE护航企业免受泄密之害

随着网络技术的发展&#xff0c;通过网络应用如网盘、网页、邮件、即时通讯工具传输分享文件变得越来越多&#xff0c;这些工具传输速度快&#xff0c;能够将大容量的文档快速传送给他人&#xff0c;在工作中受到许多人的青睐。 然而由这些传输工具引发的泄密事件也不断增多&am…

视频怎么压缩?视频太大这样处理变小

在当今时代&#xff0c;视频已经成为了我们日常生活中不可或缺的一部分&#xff0c;然而&#xff0c;视频文件往往非常大&#xff0c;给我们的存储和传输带来了很大的不便&#xff0c;那么&#xff0c;如何有效地压缩视频呢&#xff1f; 一、使用压缩软件 首先我们给大家分享一…

供应商工厂突发爆炸,日本丰田7座工厂停工 | 百能云芯

根据日本共同社的最新报导&#xff0c;日本著名汽车制造商丰田汽车近期遭遇了一系列生产中断问题。这次生产中断的根本原因在于供应商公司发生了一起爆炸事件&#xff0c;导致零部件供应链受到了严重干扰&#xff0c;迫使丰田暂时停工。截至目前&#xff0c;这一事件已经影响了…

【触想智能】工业级触摸显示器的分类与应用分享

工业级触摸显示器是具有触摸功能的工业显示器&#xff0c;常见的触摸方式有电容触摸和电阻触摸。它是应用在工业上的设备&#xff0c;和普通的显示器有着很大的区别。 工业级触摸显示器由液晶触摸屏、功能主板、外壳三部分组成&#xff0c;结构用料一般都采用铝合金材质&#x…

配电房无人值守方案

随着科技的不断进步&#xff0c;许多传统需要人工操作和维护的领域逐渐被自动化和智能化方案所替代。配电房作为电力供应的核心部分&#xff0c;也面临着同样的变革。 力安科技电易云配电室无人值守监控系统以智能物联数据采集和智能物联管控"为关键&#xff0c;通过加…

自动化测试必会之数据驱动测试

数据驱动测试 在实际的测试过程中&#xff0c;我们会发现好几组用例都是相同的操作步骤&#xff0c;只是测试数据的不同&#xff0c;而我们往往需要编写多次用例来进行测试&#xff0c;此时我们可以利用数据驱动测试来简化该种操作。 参数化&#xff1a; 输入数据的不同从而产…

Linux性能优化--性能工具:特定进程内存

5.0 概述 本章介绍的工具使你能诊断应用程序与内存子系统之间的交互&#xff0c;该子系统由Linux内核和CPU管理。由于内存子系统的不同层次在性能上有数量级的差异&#xff0c;因此&#xff0c;修复应用程序使其有效地使用内存子系统会对程序性能产生巨大的影响。 阅读本章后&…

反转链表(java)

大家好我是苏麟今天说一说链表常见的简单题目 . BM1 反转链表 牛客BM1 反转链表 : 描述 : 给定一个单链表的头结点(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 分析 : …

安装thinkphp6并使用多应用模式,解决提示路由不存在解决办法

1. 安装稳定版tp框架 composer create-project topthink/think tptp是安装完成的目录名称 &#xff0c;可以根据自己需要修改。 如果你之前已经安装过&#xff0c;那么切换到你的应用根目录下面&#xff0c;然后执行下面的命令进行更新&#xff1a; composer update topthin…

一百九十、Hive——Hive刷新分区MSCK REPAIR TABLE

一、目的 在用Flume采集Kafka中的数据直接写入Hive的ODS层静态分区表后&#xff0c;需要刷新表&#xff0c;才能导入分区和数据。原因很简单&#xff0c;就是Hive表缺乏分区的元数据 二、实施步骤 &#xff08;一&#xff09;问题——在Flume采集Kafka中的数据写入HDFS后&am…

GitLab-访问返回403 forbidden问题处理

访问gitlab时报错forbidden 一般访问量大&#xff0c;密码错误频率高的时候&#xff0c;gitlab防爆机制启动了&#xff0c;对IP做了封禁&#xff0c;导致某些IP访问的是否返回 403 forbidden 1. 查看被封的IP /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/red…

和硕首次参加展OCP 峰会,将发布多项AI合作项目产品 | 百能云芯

电子代工大厂和硕联合科技宣布&#xff0c;将参与今年的 OCP 全球峰会 (OCP Global Summit)&#xff0c;展示与英伟达 (NVIDIA) 合作成果&#xff0c;包含使用英伟达 GH200 Grace Hopper 超级芯片的 MGX AI 服务器&#xff0c;以及搭载 A100、L40 等服务器产品。 OCP 峰会于 10…