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.rhkb.cn/news/161734.html

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

相关文章

论文阅读:Point-to-Voxel Knowledge Distillation for LiDAR Semantic Segmentation

来源&#xff1a;CVPR 2022 链接&#xff1a;https://arxiv.org/pdf/2206.02099.pdf 0、Abstract 本文解决了将知识从大型教师模型提取到小型学生网络以进行 LiDAR 语义分割的问题。由于点云的固有挑战&#xff0c;即稀疏性、随机性和密度变化&#xff0c;直接采用以前的蒸馏…

正点原子嵌入式linux驱动开发——设备树下LED驱动

经过对设备树的学习以及驱动开发中常用的OF函数介绍&#xff0c;本篇笔记将之前的新字符设备驱动的LED&#xff0c;换成设备树形式。 设备树LED驱动原理 在之前的新字符设备驱动实验中&#xff0c;直接在驱动文件newchrled.c中定义有关寄存器物理地址&#xff0c;然后使用io_…

Groovy语法Gradle配置学习笔记

第一部分&#xff1a;Groovy语法 变量的类型和定义 Groovy所有类型都是对象类型&#xff1a; int x 10 println x.class double y 3.14 println y.classdef 定义变量&#xff1a; def str "dddd" println str.class字符串 字符串&#xff1a; // 单引号 双引号…

el-input: 把不符合正则校验的值动态清空,只保留符合的值

<el-input v-model"form.profit" placeholder"请输入授权专利新增利润" input"handleInput" clearable />/*** 不符合正则校验,清空*/const handleInput () > {if (form.value.profit) {if (!/^\d*\.?\d*$/.test(form.value.profit))…

基于STM32_DHT11单总线温湿度传感器驱动

基于STM32_DHT11单总线温湿度传感器驱动 文章目录 基于STM32_DHT11单总线温湿度传感器驱动前言一、DHT11&#xff1f;二、原理1.时序1.主机复位信号和 DHT11 响应信号2.信号‘0’的表示3.信号‘1’的表示4.整个数据信号收发流程 2.数据结构 三、驱动1 .h文件&#xff1a;2 .c文…

CSS 笔记/练习

CSS 概述 与 html 配合&#xff0c;实现内容与样式分离样式美化 标签中元素作用 class&#xff1a;class属性用于为元素指定一个或多个样式类。通过为元素添加class属性&#xff0c;可以将其与CSS样式表中的样式规则关联起来&#xff0c;从而改变元素的外观和行为。一个元素可…

网络工程师知识点7

111、IS-IS路由器的三种类型&#xff1f; Level-1路由器&#xff08;只能创建level-1的LSDB&#xff09; Level-2路由器&#xff08;只能创建level-2的LSDB&#xff09; Level-1-2路由器&#xff08;路由器默认的类型&#xff0c;能同时创建level-1和level-2的LSDB&#xff09;…

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

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

公司如何防止源代码外泄,保护开发部门代码安全呢?

在智能制造业中&#xff0c;研发人员的开发环境&#xff0c;大多数采用c#开发语言svn 或c#git进行软件系统的开发&#xff0c;但是c#语言如何来防泄密保护呢&#xff1f;德人合科技针对于制造类企业制定了安全稳定的源代码防泄密方案&#xff0c;不影响员工的正常工作&#xff…

【数字图像处理笔记】01-数字图像基础

01-数字图像基础 图像类型 黑白(二值)图像 只有黑白两种颜色的图像称为黑白图像或单色图像&#xff0c;图像的每个像素只能是黑或白&#xff0c;没有中间的过渡&#xff0c;故又称为二值图像。 二值图像的像素值只能为0或1&#xff0c;图像中的每个像素值用1位存储。图像矩阵中…

Eudic欧路词典 for Mac(可离线英语学习工具)

Eudic欧路词典是一款功能强大的英语学习工具&#xff0c;旨在为用户提供全面的词汇解释和例句。该软件整合了多个权威词典&#xff0c;包括牛津、柯林斯等&#xff0c;提供了全面准确的词汇解释和用法示例。同时&#xff0c;它还支持离线使用&#xff0c;用户可以在无网络连接的…

EasyExcel

EasyExcel 官方文档 EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel (alibaba.com) 优势 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出…

电脑蓝牙与ESP32蓝牙连接,让电脑发现ESP32

win11蓝牙默认只查看常见蓝牙设备。ESP32创建的蓝牙很有可能是看不到的。 再蓝牙设备发现一栏选择高级&#xff0c;才能查看所有蓝牙设备。 只要下面几行代码&#xff0c;就能让PC发现ESP32 #include <BLEDevice.h> // 引入相关库void setup() {BLEDevice::init("…

学习pytorch13 神经网络-搭建小实战Sequential的使用

神经网络-搭建小实战&Sequential的使用 官网模型结构根据模型结构和数据的输入shape&#xff0c;计算用在模型中的超参数coderunning log网络结构可视化 B站小土堆pytorch视频学习 官网 https://pytorch.org/docs/stable/generated/torch.nn.Sequential.html#torch.nn.Se…

图扑智慧仓储数据可视化监控平台

随着市场竞争加剧和市场需求的不断提高&#xff0c;企业亟需更加高效、智能且可靠的仓储物流管理方式&#xff0c;以提升企业的物流效率&#xff0c;减少其输出成本&#xff0c;有效应对市场上的变化和挑战。 图扑软件应用自研 HT for Web 产品搭建的 2D 智慧仓储可视化平台&a…

全流程TOUGH系列软件实践技术应用

查看原文>>>全流程TOUGH系列软件实践技术应用 TOUGH系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH系列软件采用模块化设计和有限积分差网格剖分…

JavaScript系列从入门到精通系列第二十篇:使用工厂方法创建JavaScript对象,JavaScript构造函数详解,JavaScript类概念的介绍

文章目录 一&#xff1a;使用工厂方法创建对象 1&#xff1a;原始写法 2&#xff1a;工厂方式 3&#xff1a;结果验证 二&#xff1a;构造函数 1&#xff1a;什么是构造函数 2&#xff1a;构造函数和普通函数的区别 3&#xff1a;构造函数的执行流程 三&#xff1a;类…

计算机网络中的CSMA/CD算法的操作流程(《自顶向下》里的提炼总结)

具有碰撞检测的载波侦听多路访问&#xff08;CSMA/CD算法&#xff09; 以下内容总结&#xff0c;对应《计算机网络自顶向下第七版》第六章链路层和局域网P299 操作流程&#xff1a; NIC&#xff08;适配器&#xff0c;即网络接口&#xff09;从网络层接收数据报&#xff0c;…

pycharm远程连接miniconda完整过程,以及遇到的问题解决

问题1&#xff1a;no-zero exit code(126) env: ‘/home/user2/miniconda3/envs/ihan/bin/python3’: Too many levels of symbolic links Python interpreter process exited with a non-zero exit code 126 因为选择的新建导致太多软连接&#xff0c;先在服务器上建好虚拟环…

【yolov8系列】yolov8的目标检测、实例分割、关节点估计的原理解析

1 YOLO时间线 这里简单列下yolo的发展时间线&#xff0c;对每个版本的提出有个时间概念。 2 yolov8 的简介 工程链接&#xff1a;https://github.com/ultralytics/ultralytics 2.1 yolov8的特点 采用了anchor free方式&#xff0c;去除了先验设置可能不佳带来的影响借鉴Genera…