7.Shuffle详解

news2024/9/21 2:46:09

 1.分区规则

ps."&"指的是按位与运算,可以强制转换为正数 

ps."%",假设reduceTask的个数为3,则余数为0,1,2正好指代了三个分区

       以上代码的含义就是对key的hash值强制取正之后,对reduce的个数取余,这样的话,如果key相同,则hash值相同,则余数相同,则会放到同一分区。

      但是如果某一种key过多,则会导致分区不均匀,此问题称为数据倾斜

2.自定义分区

自定义分区用于解决数据倾斜问题

案例:

         数据:一堆手机号

         需求:手机号136、137、138、139开头都分别放到一个独立的4个分区中,其他开头的放到一个分区中,然后对总流量进行倒序排序

重点:(1)全局排序是不能分区的(2)把流量当作key来排序

 3.1 bean阶段(自定义排序规则:继承WritableComparable接口)

public class FlowBean implements WritableComparable<FlowBean>{

    private Integer upFlow;
    private Integer downFlow;
    private Integer sumFlow;
}

生成set/get阶段:

    public Integer getUpFlow() {
        return upFlow;
    }

    public void setUpFlow(Integer upFlow) {
        this.upFlow = upFlow;
    }

    public Integer getDownFlow() {
        return downFlow;
    }

    public void setDownFlow(Integer downFlow) {
        this.downFlow = downFlow;
    }

    public Integer getSumFlow() {
        return sumFlow;
    }

    public void setSumFlow(Integer sumFlow) {
        this.sumFlow = sumFlow;
    }

重写toString方法:

public String toString() {
        return upFlow  + "\t" + downFlow + "\t" +sumFlow;
    }

序列化方法与反序列化方法:

// 序列化
public void write(DataOutput out) throws IOException {
        out.writeInt(upFlow);
        out.writeInt(downFlow);
        out.writeInt(sumFlow);
    }

// 反序列化
public void readFields(DataInput in) throws IOException {
        upFlow = in.readInt();
        downFlow = in.readInt();
        sumFlow = in.readInt();
    } 

 计算总流量

public void setSumFlow() {
        this.sumFlow = this.upFlow + this.downFlow;
    }
自定义排序规则:倒叙输出:当this.getSumFlow()大于o.getSumFlow()时候,返回负数
public int compareTo(FlowBean o) {
        return -this.getSumFlow().compareTo(o.getSumFlow());
    }

3.2 自定义分区规则:需要继承Hadoop的提供的Partitioner对象

public class PhonePartitioner extends Partitioner<FlowBean,Text> {

    public int getPartition(FlowBean flowBean,Text text,int numPartitions) {

        int phonePartitions;
        // 获取手机号
        String phoneNum = text.toString();
        if(phoneNum.startsWith("136")){
            phonePartitions = 0;
        }else if(phoneNum.startsWith("137")){
            phonePartitions = 1;
        }else if(phoneNum.startsWith("138")){
            phonePartitions = 2;
        }else if(phoneNum.startsWith("139")){
            phonePartitions = 3;
        }else {
            phonePartitions =4;
        }
        return phonePartitions;
    }
}

3.3 map阶段:要求输出时以流量做为k,以手机号为v

public class FlowMapper extends Mapper<LongWritable, Text, FlowBean, Text> {


    private Text outv = new Text();

    private FlowBean  outk = new FlowBean();



    protected void map(LongWritable key, Text value, Context context) 
            throws IOException, InterruptedException {
        // 获取当前行数据
        String line = value.toString();
        // 切割数据  
        String[] phoneDatas = line.split("\t");
        // 获取输出数据的key(手机号)
        outv.set(phoneDatas[1]);
        // 获取输出数据的value
        outk.setUpFlow(Integer.parseInt(phoneDatas[phoneDatas.length-3]));
        outk.setDownFlow(Integer.parseInt(phoneDatas[phoneDatas.length-2]));
        outk.setSumFlow();

        // 将数据输出
        context.write(outk, outv);

    }

}

3.4 recue阶段:reduce做的事情就是把数据翻转着写出去

public class FlowReducer extends Reducer<FlowBean, Text, Text, FlowBean> {


private FlowBean outv = new FlowBean();


protected void reduce(FlowBean key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        // 遍历输出
        for (Text value : values) {
            context.write(value,key);
        }
    }

}

3.5 driver阶段:将以上代码整合起来

 3.Combiner

定义:就是数据合并,将map的输出结果预聚合,减小网络传输量,比如:

                                 (map,1)(map,1)  (map,1) => (map,3)

Combiner和reducer的差别:

Combiner是对每一个mapper进行汇总,reducer是对所有的mapper进行汇总

使用前提:不能影响最终的业务逻辑,combiner输出的kv应该和reducer输出的kv对应

假如有3,5,7,2,6求平均值,使用combiner做局部合并和使用reducer做全局合并:

 位置:mapper中,处于分区快排之后,溢写之前

 使用案例:对wordCount使用Combiner

1.自定义Combiner类:重写reducer方法

public class WordcountCombiner extends Reducer<Text, IntWritable, Text,IntWritable>{

	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {

        // 1 汇总操作
		int count = 0;
		for(IntWritable v :values){
			count += v.get();
		}

        // 2 写出
		context.write(key, new IntWritable(count));
	}
}

2.在driver中添加Combiner类:

job.setCombinerClass(WordcountCombiner.class);

 4.shuffle流程总结 

 ps1.map缓冲区:

环形缓冲区,右边写数据,左边写元数据。但是环形缓冲区是不能碰头的,否则一端的数据会覆盖另一端的数据,所以达到80%就开始溢写

ps2.reduce缓冲区:

如果缓冲区足够大,整个归排就直接在内存中执行,否则就溢写到磁盘进行,最后在发给reduc

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

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

相关文章

《可穿戴环形生物阻抗装置连续无袖血压监测》阅读笔记

目录 一、论文简介 二、十个问题 参考文献 一、论文简介 本文提出了一种基于环形生物阻抗传感器的连续无袖血压监测方法。该方法利用可穿戴环形生物阻抗装置实现连续无袖血压监测&#xff0c;并通过优化电极与皮肤接触点来提高信号灵敏度。实验结果表明&#xff0c;该方法可…

【动态规划】背包问题

目录 一:思路简介 二&#xff1a;0-1 背包 三&#xff1a;完全背包 四&#xff1a;多重背包 五&#xff1a;分组背包 一:思路简介 n 个物品&#xff0c;容量为V的背包 Vi 体积 Wi 价值(权重) 二&#xff1a;0-1 背包 每件物品最多只能用1次&#xff08;要么0次&…

给httprunnermanager接口自动化测试平台加点功能(一)

文章目录 一、背景1.1、部署过程略二、使用过程2.1、新增接口列2.2、实现搜索效果三、总结 一、背景 https://github.com/httprunner/HttpRunnerManager.git从github上找的接口测试平台&#xff0c;引入公司作为测试协同测试的平台&#xff0c;底层框架基于httprunner(requests…

【单目标优化算法】杂草优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

这些使用工具大推荐,现在知道不晚

1.Snip Snip是一款截图软件&#xff0c;它突出的优点就是可以制作滚动截图。 例如&#xff1a;对整个网页进行截图&#xff0c;使用Snip即可轻松获取&#xff0c;无需处理水印。 2.Sleep Cycle 快节奏、高压力的生活导致我们越来越晚睡觉&#xff0c;睡眠质量越来越差。 想提…

Python学习9:对指定r计算圆的面积(python123)

平台&#xff1a;python123 题目描述: 编写函数getCircleArea(r),对给定的参数r计算圆的面积&#xff0c;并返回首先读入n&#xff08;n>0&#xff09;&#xff0c;然后依次读入n个半径r1,r2,...,rn,以这些半径为参数依次调用getCircleArea函数&#xff0c;得到对应圆的面…

3.动态规划(0x3f:从周赛中学算法 2022下)

来自0x3f 【从周赛中学算法 - 2022 年周赛题目总结&#xff08;下篇&#xff09;】&#xff1a;https://leetcode.cn/circle/discuss/WR1MJP/ 【【灵茶山艾府】2022 年周赛题目总结&#xff08;上篇&#xff09;】https://leetcode.cn/circle/discuss/G0n5iY/ 学习动态规划是否…

( 栈和队列) 503. 下一个更大元素 II ——【Leetcode每日一题】

❓503. 下一个更大元素 II 难度&#xff1a;中等 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字…

为何越来越多人不喜欢“试用期六个月”的公司?网友:感觉不靠谱

众所周知&#xff0c;任何一份工作都有试用期&#xff0c;一般是三月左右。但如果你遇到试用期达到半年的公司&#xff0c;你会不会进入&#xff1f; 近日&#xff0c;就有人遇到了此类公司&#xff0c;并对是否要进入该公司犹豫不决。他在论坛上发帖求助&#xff1a;大家是怎…

京城、京味、京韵:从一台服务器看数字北京

北京&#xff0c;既是首善之都&#xff0c;也是数字化创新之城。 早在1999年&#xff0c;北京就基于整座城市的信息化建设方案&#xff0c;率先提出了“数字北京”。后来&#xff0c;数字北京的魅力在奥运会期间大放异彩&#xff0c;受到了全球高度认可。如今&#xff0c;数字经…

【Python】【进阶篇】10、Django中间件

目录 Django中间件1. Django默认自带中间件1&#xff09;中间的执行与响应顺序2&#xff09;在调用视图之前3&#xff09;在调用视图之后 2. 中间件的作用总结 Django中间件 中间件是一个插件系统&#xff0c;嵌入在 Django 的 Request 和 Response 之间执行&#xff0c;可以对…

使用@Bean注解指定初始化和销毁的方法

bean的生命周期 通常意义上讲的bean的生命周期&#xff0c;指的是bean从创建到初始化&#xff0c;经过一系列的流程&#xff0c;最终销毁的过程。只不过&#xff0c;在Spring中&#xff0c;bean的生命周期是由Spring容器来管理的。在Spring中&#xff0c;我们可以自己来指定be…

apple pencil有买的必要吗?便宜的平替电容笔推荐

在当今世界&#xff0c;电容笔就已经成为一种热门的电子产品&#xff0c;其的各项性能也在不断改进。因此&#xff0c;如何挑选一款性价比高的电容笔成为大家关心的焦点&#xff0c;越来越多的人开始追求更好更廉价的电容笔。那么&#xff0c;哪个品牌的电容笔价格更实惠、性价…

工业设备巨头MSC Industrial Supply的供应链建设——EDI

MSC Industrial Supply提供广泛的工业用品和解决方案&#xff0c;包括切削工具、测量工具、金属加工和设备维护工具、劳动保护用品、工业设备等。MSC Industrial Supply的供应商来自全球各地&#xff0c;包括多个行业的领先品牌&#xff0c;例如Kennametal、Sandvik Coromant、…

【图像分割】【深度学习】SAM官方Pytorch代码-Prompt encoder模块ProEnco网络解析

【图像分割】【深度学习】SAM官方Pytorch代码-Prompt encoder模块PromptEncoder网络解析 Segment Anything&#xff1a;建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像上有超过1亿个掩码&#xff0c;模型的设计和训练是灵活的&#xff0c;其重要的特点是Zero-shot(…

北邮22信通:二叉树层序遍历的非递归算法:A Story Between Two Templates

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 目录 一.总纲 二.用队列存储 2.1用模板类实现队列 2.1.1核心思路&#xff1a; …

丁鹿学堂:使用vite手动构建vue项目的注意事项和步骤总结

使用yarn 默认安装了nodeJS环境&#xff0c;使用yarn&#xff0c;比npm更好用。 npm install --global yarn使用yarn按钻过vite yarn add -D vite使用yarn初始化项目 yarn init -y安装vite yarn add vite -D安装vue yarn add vue项目目录&#xff1a; 创建index.html sr…

分享一个有意思的文字飞入动画(模仿水滴融合)

先上效果图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}:root {--text-…

前后端分离demo 旅馆管理系统(Angular+Springboot)

模型设计 旅馆管理系统&#xff0c;主要涉及到登记入住&#xff0c;退房以及客房和客人信息管理&#xff1b;经过分析抽像出涉及到的实体以及各实体之间的关系&#xff1a;   可以看出整个业务以客房为中心&#xff0c;入住&#xff0c;退房&#xff0c;定价&#xff0c;收费…

Build an SAP Fiori App(一)后面更新中

1.登录 SAP BTP Trial 地址&#xff1a; https://account.hanatrial.ondemand.com 流程可以参考 点击 serviced marketplace 搜索studio 点击创建 点击创建&#xff0c;点击view subscription 点击go to application 创建完成后 添加新链接 Field Value Name ES5 - if you’…