spark shuffle——shuffle管理

ShuffleManager

shuffle系统的入口。ShuffleManager在driver和executor中的sparkEnv中创建。在driver中注册shuffle,在executor中读取和写入数据。

registerShuffle:注册shuffle,返回shuffleHandle
unregisterShuffle:移除shuffle
shuffleBlockResolver:获取shuffleBlockResolver,用于处理shuffle和block之间的关系
getWriter:获取partition对应的writer,在executor的map task中调用
getReader、getReaderForRange:获取一段范围partition的reader,在executor的 reduce task中调用

SortShuffleManager

是shuffleManager的唯一实现。
在基于sort的shuffle中,进入的消息会按照partition进行排序,最后输出一个单独的文件。
reducer会读取这个文件的一段区域数据。
当输出的文件太大了,不能全部放在内存中的时候,会spill在磁盘上生成排序的中间结果文件,这些中间文件会合并成一个最终文件输出。
Sort-based shuffle有两个方式:

  • 序列化sort,使用序列化sort需要满足三个条件:
    1. 没有map-side combine
    2. 支持序列化的值relocation(KryoSerializer和sparkSql自定义序列化器)
    3. 小于等于16777216个partition
  • 非序列化sort,其它所有情况都可以使用非序列化sort

序列化sort的优势
在序列化sort模式下,shuffle writer将进来的消息序列化后保存在一个数据结构中并排序。

  1. 二进制数据排序而非Java对象:排序操作直接在序列化的二进制数据上进行,而不是在Java对象上,这样可以降低内存消耗并减少垃圾回收(GC)的开销。
    这一优化要求所使用的记录序列化器具备特定属性,使得序列化后的记录能够在无需先反序列化的情况下重新排序。
  2. 高效的缓存排序算法:采用专门设计的缓存效率高的排序器(ShuffleExternalSorter),它能够对压缩后的记录指针数组和分区ID进行排序。通过每个记录仅占用8字节的空间,这种策略使得更多的数据能够装入缓存中,从而提升性能。
  3. 溢出合并过程针对同一分区内的序列化记录块进行,整个合并过程中不需要对记录进行反序列化,避免了不必要的数据转换开销。
  4. 如果溢出压缩编解码器支持压缩数据的拼接,那么溢出合并过程仅需简单地将序列化并压缩过的溢出分区数据拼接起来,形成最终输出分区。这允许使用高效的直接数据拷贝方法,如NIO中的transferTo,并且在合并过程中避免了分配解压缩或复制缓冲区的需要,提升了整体效率。

registerShuffle

根据不同场景选择对应的handle。优先顺序是BypassMergeSortShuffleHandle>SerializedShuffleHandle>BaseShuffleHandle

bypass条件:没有mapside,partition数量小于等于_SHUFFLE_SORT_BYPASS_MERGE_THRESHOLD_

序列化handle条件:序列化类支持支持序列化对象的迁移,并且不使用mapSideCombine操作以及父RDD的分区数不大于 (1 << 24)

getWriter

首先缓存此次的shuffle和map信息到taskIdMapsForShuffle_中_
根据shuffle对应的handle选择对应的writer.
BypassMergeSortShuffleHandle->BypassMergeSortShuffleWriter
SerializedShuffleHandle->UnsafeShuffleWriter
BaseShuffleHandle->SortShuffleWriter

unregisterShuffle

taskIdMapsForShuffle移除对应的shuffle和shuffle对应map产生的文件

getReader/getReaderForRange

获取shuffle文件对应全部block地址,即blocksByAddress.
创建BlockStoreShuffleReader对象并返回.

ShuffleHandle

主要是用来传递shuffle的参数,同时也是一个标记,标记选择哪个writer

BaseShuffleHandle

BypassMergeSortShuffleHandle

SerializedShuffleHandle

ShuffleWriter

抽象类,负责map任务输出消息.主要方法是write,有三个实现类

  • BypassMergeSortShuffleWriter
  • SortShuffleWriter
  • UnsafeShuffleWriter

后面在单独分析。

ShuffleBlockResolver

特质,实现类可以根据mapId、reduceId、shuffleId来获取对应的block数据.

IndexShuffleBlockResolver

ShuffleBlockResolver的唯一实现类。
创建并维护逻辑块与物理文件位置之间的映射关系,针对来自同一map任务的shuffle块数据。
属于同一个map任务的shuffle块数据会被存储在一个整合的数据文件中。
而这些数据块在数据文件中的偏移量,则被单独存储在一个索引文件中。
.data是数据文件后缀
.index是索引文件后缀

getDataFile

获取数据文件。
生成ShuffleDataBlockId,调用的blockManager.diskBlockManager.getFile方法获取file

getIndexFile

同getDataFile类似
生成ShuffleIndexBlockId,调用的blockManager.diskBlockManager.getFile方法获取file

removeDataByMap

根据shuffleId和mapId获取到data文件和index文件,然后删除

writeIndexFileAndCommit

根据mapId、shuffleId获取对应的data文件和index文件。
检查data文件和index文件是否存在并且能够匹配上,直接返回。
不能匹配上,就生成新的index临时文件。再重命名生成新的index文件和data文件并返回。


假设shuffle有3个partition,对应数据大小分别是1000、1500、2500。
index文件,首行是0,后面都是partition数据的累加值,第二行是1000,第三行是1000+1500=2500,第三行是2500+2500=5000.
data文件是按照partition大小排序进行存储的。

checkIndexAndDataFile

校验data文件和index文件是否匹配,不匹配返回null,匹配返回partition大小的数组。
1.index文件大小是 (blocks + 1) * 8L
2.index文件第一行是 0
3.获取partition的大小写入lengths,lengths的汇总值等于data文件大小
满足上面三个条件,返回lengths,否则返回null

getBlockData

获取到shuffleId、mapId、startReduceId、endReduceId
获取到index文件
读取对应的startOffset和endOffset
使用data文件、startOffset、endOffset生成FileSegmentManagedBuffer并返回

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LED显示屏跟COB显示屏有哪些不同?

COB显示屏跟LED显示屏的主要区别在于产品的显示效果、封装技术、耐用性、防护力、维护以及制造成本方面的不同&#xff0c;这里所说的LED显示屏主要指的是使用SMD封装的LED显示屏&#xff0c;今天跟随COB显示屏厂家中品瑞科技一起来详细看看具体分析&#xff1a; 一、封装技术 …

视图库对接系列(GA-T 1400)九、视图库对接系列(本级)机动车数据推送

背景 在上几章中,我们已经可以将视图库的平台写到我们的数据库中了。 换句话说就已经接入我们的平台了,这几期的话,我们就对接设备, 将设备的数据接入到我们平台来。 机动车数据推送 接入机动车数据推送相对比较简单,我们只需要实现对应的接口就ok了。 具体如图: 有增…

77. UE5 RPG 创建角色的技能栏

在前面的文章里&#xff0c;我们实现了角色属性技能和场景。接下来&#xff0c;我们要优化角色显示UI&#xff0c;在屏幕底部显示角色血量&#xff0c;蓝量&#xff0c;技能和经验值。 创建新的用户控件 选择创建新的控件蓝图 父类为我们自定义的RPGUserWidget&#xff0c;这…

这样拼板帮你省近万元,堪称PCB工程师成本终结者!

别再被骗了&#xff0c;打PCB板价格高不是单价高&#xff01;而是你的拼板导致利用率太低了&#xff01; 今天给大家讲个小故事&#xff0c;教大家如何省钱...... 一个爽朗的晴天&#xff0c;我听闻同事说有客户对他吐槽打板子价格太高&#xff0c;说着说着就开始吹起了牛逼...…

【论文阅读】VASA-1: Lifelike Audio-Driven Talking FacesGenerated in Real Time

整体框架。不直接生成视频帧&#xff0c;而是在潜在空间中生成整体面部动态和头部运动&#xff0c;条件是音频和其他信号。给定这些运动潜在编码&#xff0c;通过面部解码器生成视频帧&#xff0c;还接受从输入图像中提取的外观和身份特征作为输入。 构建了一个面部潜在空间并…

【C#】ProgressBar进度条异步编程思想

1.控件介绍 进度条通常用于显示代码的执行进程进度&#xff0c;在一些复杂功能交互体验时告知用户进程还在继续。 在属性栏中&#xff0c;有三个值常用&#xff1a; Value表示当前值&#xff0c;Minimum表示进度条范围下限&#xff0c;Maximum表示进度条范围上限。 2.简单实…

【网络安全】第8讲 网络安全协议(笔记)

一、网络安全协议概述 1、协议 是指两个或多个以上参与者为完成某项特定的任务而采取的一系列步骤。 2、网络协议 是指计算机网络中通信各方关于如何进行数据交换所达成的一致性规则、标准或约定的集合&#xff0c;即由参与通信的各方按确定的步骤做出一系列通信动作&#xff…

Linux系统安装青龙面板结合内网穿透实现使用公网地址远程访问

文章目录 前言一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用。本教程使用Docker部署青龙&#xff0c;如何安装Docker详见&#xff1a; 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 …

Embedded Coder生成C代码注释

学习目标 本教程将向您说明如何生成包含以下内容的代码&#xff1a; 在函数前注中包含函数签名和函数帮助文本。包含 MATLAB 源代码&#xff0c;以带有可追溯性标记的注释表示。在代码生成报告中&#xff0c;可追溯性标记链接到对应的 MATLAB 源代码。 前提条件 要完成本教…

入门PHP就来我这(纯干货)08

~~~~ 有胆量你就来跟着路老师卷起来&#xff01; -- 纯干货&#xff0c;技术知识分享 ~~~~ 路老师给大家分享PHP语言的知识了&#xff0c;旨在想让大家入门PHP&#xff0c;并深入了解PHP语言。 1 PHP对象的高级应用 1.1 final关键字 final 最终的、最后的。被final修饰过的类…

固相提取铕和铀

固相萃取&#xff08;Solid Phase Extraction&#xff0c;SPE&#xff09;是一种常用的化学分离技术&#xff0c;它利用固体吸附剂&#xff08;固定相&#xff09;与样品中的目标化合物&#xff08;流动相&#xff09;之间的相互作用力&#xff0c;将目标化合物从样品中分离出来…

JVM的五大内存区域

JVM的五大内存区域 JVM内存区域最粗略的划分可以分为 堆 和 栈 &#xff0c;当然&#xff0c;按照虚拟机规范&#xff0c;可以划分为以下几个区域&#xff1a; JVM内存分为线程独享区和线程共享区&#xff0c; 其中 方法区 和 堆 是线程共享区&#xff0c; 虚拟机栈, 本地方法…

为什么需要做网络安全服务?

网络安全服务之所以重要&#xff0c;是因为它在保护数字资产、维护企业运营、确保法规遵从、防范恶意行为以及建立信任等方面扮演着关键角色。以下是一些主要的理由&#xff1a; 保护核心资产和数据&#xff1a; 数字化转型使得企业数据变得极其宝贵&#xff0c;包括知识产权、…

竞赛选题 协同过滤电影推荐系统

文章目录 1 简介1 设计概要2 课题背景和目的3 协同过滤算法原理3.1 基于用户的协同过滤推荐算法实现原理3.1.1 步骤13.1.2 步骤23.1.3 步骤33.1.4 步骤4 4 系统实现4.1 开发环境4.2 系统功能描述4.3 系统数据流程4.3.1 用户端数据流程4.3.2 管理员端数据流程 4.4 系统功能设计 …

开发在线教育项目-在线课程视频网站开发

用了哪些技术 后端技术 springboot3 security权限框架&#xff08;后台&#xff09;mybatisPlus框架jwt生成tokeneasyexcel导入导出递归查询拦截器校验tokenredis的zset做排行榜功能redis的list做最新课程的功能redis做为缓存技术redis作为计数器&#xff0c;实时记录浏览量&…

极狐GitLab 将亮相2024空天信息大会暨数字地球生态峰会,携手中科星图赋能空天行业开发者

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

【Proteus】按键的实现『⒉种』

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

微信小程序毕业设计-走失人员的报备平台系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

【Python学习】流程控制、函数与类详解

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 Python作为一门强大而又简洁的编程语言&#xff0c;提供了丰富的工具和结构来帮助开发者编写清晰、高效的代码。在本文中…

企业搭建知识库:解锁无限潜力的钥匙

在当今这个信息爆炸的时代&#xff0c;企业如何高效地管理、传播与利用知识&#xff0c;已成为衡量其竞争力的重要标尺。知识库&#xff0c;作为这一背景下的产物&#xff0c;正逐步成为企业不可或缺的数字资产。它不仅是一个自助式的数字门户&#xff0c;更是连接员工、客户与…