PySpark基础入门(6):Spark Shuffle

news2024/12/27 19:16:14

PySpark基础入门(6):Spark Shuffle - 掘金 (juejin.cn)

目录

shuffle的执行

ShuffleManager

Hash Shuffle

Sort Shuffle Manage

Spark在DAG调度阶段会将一个Job划分为多个Stage,上游Stage做map工作,下游Stage做reduce工作,其本质上还是MapReduce计算框架。Shuffle是连接map和reduce之间的桥梁,它将map的输出对应到reduce输入中,涉及到序列化反序列化、跨节点网络IO以及磁盘读写IO等

Spark的Shuffle分为Write和Read两个阶段,分属于两个不同的Stage,前者是Parent Stage的最后一步,后者是Child Stage的第一步

shuffle的执行

执行Shuffle的主体是Stage中的并发任务,这些任务分ShuffleMapTask和ResultTask两种,ShuffleMapTask要进行Shuffle,ResultTask负责返回计算结果,一个Job中只有最后的Stage采用ResultTask,其他的均为ShuffleMapTask

ShuffleManager

ShuffleManager是负责shuffle过程的执行、计算和处理的组件,也叫shuffle管理器;有HashShuffleManager和SortShuffleManager两种实现方式;相应地也有Hash Shuffle和Sort Shuffle两种Shuffle方式

两种manager地对比:

在Spark 1.2以前,默认的shuffle计算引擎是HashShuffleManager。而HashShuffleManager有着一个非常严重的弊端,就是会产生大量的中间磁盘文件,进而由大量的磁盘IO操作影响了性能

在Spark 1.2以后的版本中,默认的ShuffleManager改成了SortShuffleManager;SortShuffleManager虽然也会产生较多的临时磁盘文件,但是最后会将所有的临时文件合并(merge)成一个磁盘文件,因此每个Task就只有一个磁盘文件。在下一个stage的shuffle read task拉取自己的数据时,只要根据索引读取每个磁盘文件中的部分数据即可

Hash Shuffle

阶段划分:

  1. shuffle write:mapper阶段,上一个stage得到最后的结果写出
  2. shuffle read :reduce阶段,下一个stage拉取上一个stage进行合并

未经优化的hashShuffleManager

根据task的计算结果的key值的hashcode%ReduceTask来决定放入哪一个区分分区,这样保证相同的数据一定放入一个分区

根据下游的task决定生成几个文件,先生成缓冲区文件在写入磁盘文件,再将block文件进行合并

经过优化的hashShuffleManager

使用shuffleFileGroup:不在根据下游task的数量决定生成文件的数量;每个shuffleFileGroup会对应一批磁盘文件,每一个Group磁盘文件的数量与下游stage的task数量是相同的; 而一个executor对应一个shuffleFileGroup

这样可以减少shuffle write阶段产生的磁盘文件的数量

比较两种方式

未经优化:

上游的task数量:m

下游的task数量:n

上游的executor数量:k (m>=k)

总共的磁盘文件:m*n

优化之后的:

上游的task数量:m

下游的task数量:n

上游的executor数量:k (m>=k)

总共的磁盘文件:k*n

Sort Shuffle Manager

SortShuffleManager的运行机制主要分成两种,一种是普通运行机制,另一种是bypass运行机制。当shuffle write task的数量小于等于spark.shuffle.sort.bypassMergeThreshold参数的值时(默认为200),就会启用bypass机制


普通运行机制流程:

(1)写入内存:数据会先写入一个内存数据结构中(默认5M),此时根据不同的shuffle算子,可能选用不同的数据结构。如果是reduceByKey这种聚合类的shuffle算子,那么会选用Map数据结构,一边通过Map进行聚合,一边写入内存;如果是join这种普通的shuffle算子,那么会选用Array数据结构,直接写入内存。

(2)内存->磁盘:每写一条数据进入内存数据结构之后,就会判断一下,是否达到了某个临界阈值。如果达到临界阈值的话,那么就会尝试将内存数据结构中的数据溢写到磁盘,然后清空内存数据结构。

(3)排序:在溢写到磁盘文件之前,会先根据key对内存数据结构中已有的数据进行排序。

(4)溢写:排序过后,会分批将数据写入磁盘文件。默认的batch数量是10000条,也就是说,排序好的数据,会以每批1万条数据的形式分批写入磁盘文件。

(5)merge:一个task将所有数据写入内存数据结构的过程中,会发生多次磁盘溢写操作,也就会产生多个临时文件。最后会将之前所有的临时磁盘文件都进行合并成1个磁盘文件,这就是merge过程。由于一个task就只对应一个磁盘文件,也就意味着该task为Reduce端的stage的task准备的数据都在这一个文件中,因此还会单独写一份索引文件,其中标识了下游各个task的数据在文件中的start offset与end offset

bypass运行机制的触发条件:

  1. shuffle map task数量小于spark.shuffle.sort.bypassMergeThreshold=200参数的值
  2. 不是map combine聚合的shuffle算子(比如reduceByKey有map combie)

bypass运行机制流程:

  1. Spark 首先会对数据进行 Shuffle 操作,将数据按照 key 进行分区,并将每个分区的数据写入多个文件中。这个过程类似于普通的 Sort Shuffle。
  2. 在写入文件之前,Spark 会检查每个分区中的数据是否已经在同一个文件中。如果是,那么就不需要再进行排序和写入文件的操作了。这个检查的过程可以通过一些统计信息来进行,例如每个分区中数据的分布情况、key 的分布情况等。
  3. 如果可以确定某些 key 的数据已经在同一个文件中,那么就会使用一个叫做 "bypass" 的技术来避免排序和写入文件的操作。具体来说,Spark 会将这些 key 的数据捆绑在一起,然后直接写入一个单独的文件中。这样可以减少数据的移动和排序次数,提高性能。
  4. 如果无法确定某些 key 的数据是否已经在同一个文件中,那么就需要进行普通的 Sort Shuffle 操作,将数据按照 key 进行排序,并将排序后的数据写入多个文件中。

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

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

相关文章

RN系统精讲-----基础了解

原生基础 安装SDK与Tools preference > appearance > systemSetting > Android sdk 如何连接设备,以及开发中的常用的adb命令 USB连接设备 adb devices 查看连接设备 wifi网络连接设备 adb connect ip(手机自己的ip地址,可以通过…

画图以及代码分析结合的循环队列的实现

循环队列的实现 概念以及结构实现初始化判空判满入队出队从队头获得元素从队尾获得元素释放 概念以及结构 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”…

优化| 割平面算法(2): Cover Cuts, Strengthening, Separation及其拓展(理论与实战详解)

【MIP Cutting plane method】-1: Cover cuts MIP的标准形式什么是Cover CutsCover Cuts的详细案例Stronger Cover Cuts及其案例Separation for Cover Cuts用Separation生成 Cover Cuts的详细例子调用Gurobi验证Cover Cuts和Stronger Cover Cuts的作用线性松弛模型的解加入Cove…

领域分类/识别方案

将用户输入与预定义的领域进行匹配 针对领域分类任务,如上图所示,我们首先会从不同的业务中收集大量的业务数据,作为基础的训练数据,虽然这些数据来自不同的业务,但是依然存在一些问题,主要有以下两方面&am…

YOLOv7测距+碰撞检测

YOLOv7测距碰撞检测 1. 相关配置2. 测距原理3. 标定和测距4. 碰撞检测4.1 相关代码4.2 主代码 5. 实验效果 相关链接 1. YOLOV5 单目测距(python) 2. YOLOV7 单目测距(python) 3. 具体实现效果已在Bilibili发布,点击…

vscode+gdbserver实现图形化调试Linux应用

一、环境: 1.远程Linux主机Ubuntu22.04; 2.vscode 1.76 二、环境搭建 1.Ubuntu 安装gdb、gdbserver、openssh-server 2.vscode 安装Remote Development、C/C 3.远程连接Linux 点击左下角的绿色按钮,然后选择connect to host----->…

Day1 组队竞赛、删除公共字符

✨个人主页: 北 海 🎉所属专栏: C/C相关题解 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 选择题1.C基础语法 编程题组队竞赛删除公共字符 选择题 1.C基础语法 题目:以下程序的运行结果是&am…

RSA加密为什么能保证安全

问题:我们都知道RSA加密是安全的,但是我们在使用的使用,怎么使用才能保证数据的安全传输呢? 一、原则:公钥机密、私钥解密、私钥签名、公钥验签 公钥私钥都可以加密和解密数据,但是因为持有公钥和私钥的人…

【Elsevier】中科院2区TOP, 高被引119篇, 稳定检索22年, 1周可见刊,5月15截稿~

一、【期刊简介】 中科院2区软计算类SCI (TOP) 【期刊概况】IF:8.0-9.0, JCR1区, 中科院2区; 【终审周期】走期刊部系统,3-5个月左右录用; 【检索情况】SCI&EI双检;正刊; 【数据库收录年份】2001年&#xff1…

【测试】概念篇

目录 🌟一、了解软件测试 🌈1、什么是软件测试 🌈2、软件测试与开发的区别(常考) 🌈3、一个优秀的软件测试人员应该具备的素质 🌟二、需求与测试用例、软件错误,软件生…

一旦80%的开发人员都开始利用ChatGPT提升工作效率后,挑战与机遇在哪里?

其实我现在已经开始逐渐开始喜欢上ChatGPT了,上班时间摸摸鱼,和ChatGPT畅谈一下理想,遇见一些不太熟练的代码也懒得去上网查了,直接问一问ChatGPT,然后自己再放置到自己的代码里,改一改,很完美。…

快递出入库管理APP开发 收发快递更方便

网购的盛行让收发快递成为很多人日常生活必不可少的一个环节,对于快递公司来说,每天有那么多的快递,如果没有一个好用的管理系统的话,不仅麻烦还很容易出现纰漏,所以快递出入库管理APP软件就显得很必要了。 快递…

python-imageio库简单使用

目录 imread_v2() get_reader() 使用imageio方法将彩色视频变为黑白视频 相关:python-动图制作及分解_觅远的博客-CSDN博客 imageio是一个用于读取和写入图像及视频数据的库,支持多种格式,且可以使用NumPy数组进行操作。常用方法&#xff…

JS逆向 -- 某平台登录加密分析

一、打开网站,使用账号密码登录 账号:aiyou123.com 密码:123456 二、通过F12抓包,抓到如下数据,发现密码加密了 三、加密结果是32位,首先考虑是md5加密。 四、全局搜索pwd,点击右上角&#xf…

C# 纯text文本字符添加上下角标

工作的需求,需要在GridView列HeaderText中插入带入带有上标和下标的字符串,比如这样的一个字符串:。。 解决办法:使用转义字符加Unicode的NumEntity就可以实现了。定义字符串如下:"O"。其中O为 。 实现&…

Linux系统目录树结构以及解释

FHS标准 Filesystem Hierarchy Standard(文件系统层次化标准)的缩写,多数Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的文件目录,FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最…

rk平台调试音频(从驱动到apk)

需要实现的功能: 输入:hdmiin、uvc、mic可以实时切换 输出:耳机和HDMI OUT同时输出声音 这里注意:mic是存在hedset情况,4节耳机,即可输出又可输出同时进行 开发情况: 一、先熟悉大致的Andro…

【24】核心易中期刊推荐——图像处理研究大数据及智能处理研究

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

springboot内嵌tomcat文件上传路径不存在问题原因

错误提示: 临时文件目录被删除,导致文件上传报错,我们使用的是linux系统,10天没有使用,就会被删除 代码: 解决办法: 配置文件中自定义临时文件上传目录 server:port: 9090tomcat:basedir: /crm/tmp 特殊情况: 当我上传小文件的时候可以上传成功,大文件的时候上传失败 猜测可…

利用Linux的corntab定时任务和shell脚本,解决傻妞卡死、发信息没反应、一直卡在即将重启、查询数据异常等问题

利用Linux的corntab定时任务和shell脚本,解决傻妞卡死、数据异常等问题 安装corntab创建shell脚本添加corntab定时任务 原理 定时杀死傻妞进程,并自动重启傻妞 安装corntab Linux crontab是用来定期执行程序的命令。 CentOS安装命令如下 yum -y insta…