什么是shuffle?shuffle的原理及过程

news2024/10/3 8:19:27

目录

一、什么是shuffle

二、为什么要引入shuffle,有哪些影响

三、shuffle的工作原理

1、shuffle的阶段

2、shuffle的中间文件

3、Shuffle Write

4、Shuffle Read

四、总结回顾


一、什么是shuffle

类比分公司的人与物和 Spark 的相关概念是这样对应的:

集团分公司与Spark相关概念对应关系

工地搬砖任务

类比上边“搬砖”的打乱重新分布,可以给Shuffle下定义了

Shuffle 的本意是扑克的“洗牌,打乱次序”,在分布式计算场景中,它被引申为集群范围内跨节点、跨进程的数据分发。

了解过三大调度组件DAGScheduler、TaskScheduler 和 SchedulerBackend的协作过程,就知道。任务调度的首要环节,是 DAGScheduler 以 Shuffle 为边界,把计算图 DAG 切割为多个执行阶段 Stages


二、为什么要引入shuffle,有哪些影响

你可能会问:“既然 Shuffle 的性能这么差,为什么在计算的过程中非要引入 Shuffle 操作呢?免去 Shuffle 环节不行吗?”

其实,计算过程之所以需要 Shuffle,往往是由计算逻辑、或者说业务逻辑决定的。结合过往的工作经验,我们发现在绝大多数的业务场景中,Shuffle 操作都是必需的、无法避免的。

在 DAG 的计算链条中,Shuffle 环节的执行性能是最差的。因为涉及到分布式数据集在集群内的分发,数据的分发必然会消耗大量的CPU、内存、网络、磁盘IO等资源。


三、shuffle的工作原理

1、shuffle的阶段

为了方便你理解,我们还是用 Word Count 的例子来做说明。在这个示例中,引入 Shuffle 操作的是 reduceByKey 算子,也就是下面这行代码

WorldCount

// 按照单词做分组计数

val wordCounts: RDD[(String, Int)] = kvRDD.reduceByKey((x, y) => x + y)

我们先来直观地回顾一下这一步的计算过程,然后再去分析其中涉及的 Shuffle 操作:

reduceByKey计算过程示意图

如上图所示,以 Shuffle 为边界,reduceByKey 的计算被切割为两个执行阶段。约定俗成地,我们把 Shuffle 之前的 Stage 叫作 Map 阶段,而把 Shuffle 之后的 Stage 称作 Reduce 阶段。在 Map 阶段,每个 Executors 先把自己负责的数据分区做初步聚合(又叫 Map 端聚合、局部聚合);在 Shuffle 环节,不同的单词被分发到不同节点的 Executors 中;最后的 Reduce 阶段,Executors 以单词为 Key 做第二次聚合(又叫全局聚合),从而完成统计计数的任务。

不难发现,Map 阶段与 Reduce 阶段的计算过程相对清晰明了,二者都是利用 reduce 运算完成局部聚合与全局聚合。在 reduceByKey 的计算过程中,Shuffle 才是关键。

仔细观察上图你就会发现,与其说 Shuffle 是跨节点、跨进程的数据分发,不如说 Shuffle 是 Map 阶段与 Reduce 阶段之间的数据交换。那么问题来了,两个执行阶段之间,是如何实现数据交换的呢?

2、shuffle的中间文件

如果用一句来概括的话,那就是,Map 阶段与 Reduce 阶段,通过生产与消费 Shuffle 中间文件的方式,来完成集群范围内的数据交换。换句话说,Map 阶段生产 Shuffle 中间文件,Reduce 阶段消费 Shuffle 中间文件,二者以中间文件为媒介,完成数据交换。

那么接下来的问题是,什么是 Shuffle 中间文件,它是怎么产生的,又是如何被消费的?

我把它的产生和消费过程总结在下图中了:

Shuffle中间文件示意图

在上一讲介绍调度系统的时候,我们说过 DAGScheduler 会为每一个 Stage 创建任务集合 TaskSet,而每一个 TaskSet 都包含多个分布式任务(Task)。在 Map 执行阶段,每个 Task(以下简称 Map Task)都会生成包含 data 文件与 index 文件的 Shuffle 中间文件,如上图所示。也就是说,Shuffle 文件的生成,是以 Map Task 为粒度的,Map 阶段有多少个 Map Task,就会生成多少份 Shuffle 中间文件。

再者,Shuffle 中间文件是统称、泛指,它包含两类实体文件,一个是记录(Key,Value)键值对的 data 文件,另一个是记录键值对所属 Reduce Task 的 index 文件。换句话说,index 文件标记了 data 文件中的哪些记录,应该由下游 Reduce 阶段中的哪些 Task(简称 Reduce Task)消费。在上图中,为了方便示意,我们把首字母是 S、i、c 的单词分别交给下游的 3 个 Reduce Task 去消费,显然,这里的数据交换规则是单词首字母。

在 Spark 中,Shuffle 环节实际的数据交换规则要比这复杂得多。数据交换规则又叫分区规则,因为它定义了分布式数据集在 Reduce 阶段如何划分数据分区。假设 Reduce 阶段有 N 个 Task,这 N 个 Task 对应着 N 个数据分区,那么在 Map 阶段,每条记录应该分发到哪个 Reduce Task,是由下面的公式来决定的。

P = Hash(Record Key) % N

对于任意一条数据记录,Spark 先按照既定的哈希算法,计算记录主键的哈希值,然后把哈希值对 N 取模,计算得到的结果数字,就是这条记录在 Reduce 阶段的数据分区编号 P。换句话说,这条记录在 Shuffle 的过程中,应该被分发到 Reduce 阶段的 P 号分区。

熟悉了分区规则与中间文件之后,接下来,我们再来说一说中间文件是怎么产生的。

3、Shuffle Write

我们刚刚说过,Shuffle 中间文件,是以 Map Task 为粒度生成的,我们不妨使用下图中的 Map Task 以及与之对应的数据分区为例,来讲解中间文件的生成过程。数据分区的数据内容如图中绿色方框所示:

 Shuffle Write执行过程

在生成中间文件的过程中,Spark 会借助一种类似于 Map 的数据结构,来计算、缓存并排序数据分区中的数据记录。这种 Map 结构的 Key 是(Reduce Task Partition ID,Record Key),而 Value 是原数据记录中的数据值,如图中的“内存数据结构”所示。

对于数据分区中的数据记录,Spark 会根据我们前面提到的公式 1 逐条计算记录所属的目标分区 ID,然后把主键(Reduce Task Partition ID,Record Key)和记录的数据值插入到 Map 数据结构中。当 Map 结构被灌满之后,Spark 根据主键对 Map 中的数据记录做排序,然后把所有内容溢出到磁盘中的临时文件,如图中的步骤 1 所示。

随着 Map 结构被清空,Spark 可以继续读取分区内容并继续向 Map 结构中插入数据,直到 Map 结构再次被灌满而再次溢出,如图中的步骤 2 所示。就这样,如此往复,直到数据分区中所有的数据记录都被处理完毕。

到此为止,磁盘上存有若干个溢出的临时文件,而内存的 Map 结构中留有部分数据,Spark 使用归并排序算法对所有临时文件和 Map 结构剩余数据做合并,分别生成 data 文件、和与之对应的 index 文件,如图中步骤 4 所示。Shuffle 阶段生成中间文件的过程,又叫 Shuffle Write。

总结下来,Shuffle 中间文件的生成过程,分为如下几个步骤:

  1. 对于数据分区中的数据记录,逐一计算其目标分区,然后填充内存数据结构;
  2. 当数据结构填满后,如果分区中还有未处理的数据记录,就对结构中的数据记录按(目标分区 ID,Key)排序,将所有数据溢出到临时文件,同时清空数据结构;
  3. 重复前 2 个步骤,直到分区中所有的数据记录都被处理为止;
  4. 对所有临时文件和内存数据结构中剩余的数据记录做归并排序,生成数据文件和索引文件。

到目前为止,我们熟悉了 Spark 在 Map 阶段生产 Shuffle 中间文件的过程,那么,在 Reduce 阶段,不同的 Tasks 又是如何基于这些中间文件,来定位属于自己的那部分数据,从而完成数据拉取呢?

4、Shuffle Read

首先,我们需要注意的是,对于每一个 Map Task 生成的中间文件,其中的目标分区数量是由 Reduce 阶段的任务数量(又叫并行度)决定的。在下面的示意图中,Reduce 阶段的并行度是 3,因此,Map Task 的中间文件会包含 3 个目标分区的数据,而 index 文件,恰恰是用来标记目标分区所属数据记录的起始索引。

Shuffle中间文件示意图

对于所有 Map Task 生成的中间文件,Reduce Task 需要通过网络从不同节点的硬盘中下载并拉取属于自己的数据内容。不同的 Reduce Task 正是根据 index 文件中的起始索引来确定哪些数据内容是“属于自己的”。Reduce 阶段不同于 Reduce Task 拉取数据的过程,往往也被叫做 Shuffle Read。

好啦,到此为止,我们依次解答了本讲最初提到的几个问题:“什么是 Shuffle?为什么需要 Shuffle,以及 Shuffle 是如何工作的”。Shuffle 是衔接不同执行阶段的关键环节,Shuffle 的执行性能往往是 Spark 作业端到端执行效率的关键,因此,掌握 Shuffle,是我们入门 Spark 的必经之路。希望今天的讲解,能帮你更好地认识 Shuffle。

四、总结回顾

首先,我们给 Shuffle 下了一个明确的定义,在分布式计算场景中,Shuffle 指的是集群范围内跨节点、跨进程的数据分发。

我们在最开始提到,Shuffle 的计算会消耗所有类型的硬件资源。具体来说,Shuffle 中的哈希与排序操作会大量消耗 CPU,而 Shuffle Write 生成中间文件的过程,会消耗宝贵的内存资源与磁盘 I/O,最后,Shuffle Read 阶段的数据拉取会引入大量的网络 I/O。不难发现,Shuffle 是资源密集型计算,因此理解 Shuffle 对开发者来说至关重要。

紧接着,我们介绍了 Shuffle 中间文件。Shuffle 中间文件是统称,它包含两类文件,一个是记录(Key,Value)键值对的 data 文件,另一个是记录键值对所属 Reduce Task 的 index 文件。计算图 DAG 中的 Map 阶段与 Reduce 阶段,正是通过中间文件来完成数据的交换。

接下来,我们详细讲解了 Shuffle Write 过程中生成中间文件的详细过程,归纳起来,这个过程分为 4 个步骤:

  1. 对于数据分区中的数据记录,逐一计算其目标分区,然后填充内存数据结构;
  2. 当数据结构填满后,如果分区中还有未处理的数据记录,就对结构中的数据记录按(目标分区 ID,Key)排序,将所有数据溢出到临时文件,同时清空数据结构;
  3. 重复前 2 个步骤,直到分区中所有的数据记录都被处理为止;
  4. 对所有临时文件和内存数据结构中剩余的数据记录做归并排序,生成数据文件和索引文件。

最后,在 Reduce 阶段,Reduce Task 通过 index 文件来“定位”属于自己的数据内容,并通过网络从不同节点的 data 文件中下载属于自己的数据记录。

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

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

相关文章

同时看过 unreal4 和 Unity 源代码的人觉得哪个引擎架构更好?

同时看过 unreal4 和 Unity 源代码的人觉得哪个引擎架构更好? UE VS U3D 技术策略上 U3D技术策略是很保守的,发出来的featurelist测试覆盖率无可非议,开发者无需多少新功能的熟悉测试成本。 UE4的技术策略是激进的,发出来的fea…

嵌入式开发学习之--点亮LED灯(上)

在嵌入式学习里,点亮LED灯的地位就如同编程语言学习里的“hello world”,是每个初学者都必须经历的一关,因为点亮了LED灯,至少可以说明几件事: 1.开发环境没问题,包括软件,硬件都没问题。 2.能…

电脑重装系统前怎么备份,重装系统怎么备份数据

有很多用户想把操作系统升级成为Win11的,但是又不知道怎么备份原来的数据,担心升级操作系统后,电脑中的重要数据全部丢失了。电脑重装系统前怎么备份?”这里小编就给我们详细介绍一下吧! 一、升级Windows 11系统要不要…

梯度多云管理技术架构的优势

随着云计算模式的日渐成熟,作为私有云和公有云的混合形态,混合云迎来了爆发期。在混合云的建设过程中,多云管理能力成为关键,梯度多云管理平台是多云时代下的服务管理利器。梯度多云管理平台是对多个公有云、私有云及各种异构资源…

视频声音怎么翻译?这几个办法教你实现视频声音翻译成中文

现如今刷视频已经成为我们的日常生活中不可缺少的一部分了,例如有时我们看到一些有用的教学视频,可能会想要把这些视频保存下来,但有些视频却都是英文的,有些小伙伴可能英语基础不好,查看起来不方便,这个时…

MySQL运算符

算术运算符 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达式,对数值或表达式进行加()、减(-)、乘(*)、除(/)和取模(%&#…

【math】Hiden Markov Model 隐马尔可夫模型了解

文章目录Introduction to Hidden Markov ModelIntroductionMarkov chainHidden Markov Model(HMM)Three QuestionsQ1: evaluate problem -- Forward algorithmQ2: decode problem -- Viterbi algorithmQ3: learn problem -- Baum-Welch algorithmApplicationIntroduction to Hi…

重装Windows系统教程(U盘制作+重装系统)

一、U盘制作 找一个不用的U盘,大小建议在15G以上,因为后面要存储下载好的电脑系统。U盘在被制作成系统盘的时候会被格式化,注意使用前将有用的信息提前保存以免丢失。 第一步:用能够正常联网的电脑打开U盘制作网站,打开…

MySQL解决group by分组后未排序问题

MySQL解决group by分组后未排序问题一、遇见问题1、错误SQL2、正确SQL一、遇见问题 当我们要实现SQL分组后取第一条数据则需要进行排序结果作为子查询后分组 CREATE TABLE op_joke (id int(11) NOT NULL AUTO_INCREMENT,name1 varchar(255) DEFAULT NULL,name2 varchar(255) D…

Spring

Spring[TOC](Spring)1、概述1.1、优点1.2、组成2. IOC概述2.1 什么是IOC2.1.1 推导过程2.1.2 IOC本质2.2 HelloSpring2.2.1 导入Jar包2.2.2 编写代码2.2.2 思考2.3 IOC过程2.4 IOC 接口3. Bean 管理3.1 基于xml方式——set方法注入3.2 FactoryBean3.3 bean 作用域3.4 bean 生命…

mannose-Biotin|甘露糖-生物素|甘露糖-聚乙二醇-生物素|生物素-PEG-甘露糖

mannose-Biotin|甘露糖-生物素|甘露糖-聚乙二醇-生物素|生物素-PEG-甘露糖 PEG接枝修饰甘露糖,mannose-PEG-Biotin 甘露糖-聚乙二醇-生物素,生物素-PEG-甘露糖 中文名称:甘露糖-生物素 英文名称:mannose-Biotin 别称&#xff…

工具分享-Ajax Interceptor

前言 资源地址: https://gitee.com/LjLoveMlh/tech_share/raw/master/%E8%B5%84%E6%BA%90/Ajax%20Interceptor/1.3.1_011.zip 给大家分享个好东西 Ajax Intercepto 帮助开发,测试人员Mock数据,更快,更安全 解决的痛点&#xff1a…

Vue3+Vite3+Vant初体验及踩过的一些坑

需要帮人做移动端的几个页面,带表单那种,说最好能用vant做,于是边学边弄记录下。 首先用 npm create vitelatest 就报错了,于是默默看了眼node包版本比官网说的低,就先升级node,升级之后再运行一次命令 …

sketch入门选手如何避坑

Sketch它是为图标设计和界面设计而生的。它是一个优秀的人。UI一站式应用Sketch画布将是无限大小的,每层都支持多种填充模式。Sketch为您提供真正合作设计过程所需的所有工具。从早期创意到像素完美的艺术品,原型清晰,与开发人员交接。Sketch…

Flink1.15源码解析--选举

文章目录一、LeaderContender二、LeaderElectionService2.1、LeaderElectionService2.2、LeaderElectionEventHandler(竞选服务的事件处理类)三 、LeaderElectionDriver3.1、LeaderLatchListener角色说明LeaderContender(竞选者)需要选主的主体,比如dispatcher、res…

Linux 夺命连环11问你能答对几个?

朋友们,先来11个快问快答看看自己能答对8个吗? 1.如何查看一个文件的末尾50行? tail -n 50 file 2.如何查看文件中包含“error”的行 cat file | grep "error" 3.如何查看某端口号是否被占用? netstat -anp | gre…

图片水印怎么加?图片加水印方法分享

相信大家在日常生活中,都会在各个平台上分享自己拍摄的照片吧,但大家在收到网友的好评和点赞的同时,是不是会因为担心图片被别人转发或者是拿去做一些不好的事情而感到烦恼呢?其实要解决这个烦恼很简单,那就是给图片添…

点击化学(Click chemistry) 叠氮-PEG4-NHS/Biotin-PEG-N3/Azid/DBCO-EPG-NHS/DBCO-NH2

点击化学(Click chemistry),也称作链接化学、速配接合组合式化学。在药物开发、生物医用材料优化、生物分子标记与检测等诸多领域中有着较好的应用,已经成为最热门的研究领域之一。点击化学符合绿色化学的12项原则,具有…

stm32 笔记 IO 口点灯实验及 HAL 库使用

GPIO 概述 全称:general purpose intput output,通用输入输出接口。 顾名思义,既可作为输入框也可以作为输入口。 引脚不一定是 GPIO,有些引脚也作为复位或晶振等使用。 GPIO的八种工作模式 输入:浮空输入&#xf…

甘露糖-酰基|mannose-Hydrazide|酰基-PEG-甘露糖

甘露糖-酰基|mannose-Hydrazide|酰基-PEG-甘露糖 酰基(acyl group),是指有机或无机含氧酸去掉一个或多个羟基后剩下的原子团,通式为R-M(O)-。 酰基(acyl group)指的是有机或无机含氧酸去掉羟基后剩下的一价原子团,通式为R-M(O)-。在有机化学…