Spark(28):Spark Shuffle解析

news2024/11/28 12:51:46

目录

0. 相关文章链接

1. ShuffleMapStage与ResultStage

2. HashShuffle解析

2.1. 未优化的HashShuffle

2.2. 优化后的 HashShuffle

3. SortShuffle解析

3.1. 普通SortShuffle

3.2. bypass SortShuffle


0. 相关文章链接

 Spark文章汇总 

1. ShuffleMapStage与ResultStage

在划分 stage 时,最后一个 stage 称为 finalStage,它本质上是一个 ResultStage 对象,前面的所有 stage 被称为 ShuffleMapStage。 

  • ShuffleMapStage 的结束伴随着 shuffle 文件的写磁盘
  • ResultStage 基本上对应代码中的 action 算子,即将一个函数应用在 RDD 的各个 partition的数据集上,意味着一个 job 的运行结束

2. HashShuffle解析

2.1. 未优化的HashShuffle

        这里我们先明确一个假设前提:每个 Executor 只有 1 个 CPU core,也就是说,无论这个 Executor 上分配多少个 task 线程,同一时间都只能执行一个 task 线程。如下图中有3个Reducer,从 Task 开始那边各自把自己进行 Hash 计算(分区器: hash/numreduce 取模),分类出 3 个不同的类别,每个 Task 都分成 3 种类别的数据,想把不同的数据汇聚然后计算出最终的结果,所以 Reducer 会在每个 Task 中把属于自己类别的数据收集过来,汇聚成一个同类别的大集合,每 1 个 Task 输出 3 份本地文件,这里有 4 个 Mapper Tasks,所以总共输出了 4 个 Tasks x 3 个分类文件 = 12 个本地小文件。 

2.2. 优化后的 HashShuffle

        优化的 HashShuffle 过程就是启用合并机制,合并机制就是复用 buffer,开启合并机制的配置是 spark.shuffle.consolidateFiles。该参数默认值为 false,将其设置为 true 即可开启优化机制。通常来说,如果我们使用 HashShuffleManager,那么都建议开启这个选项。 

        这里还是有 4 个 Tasks,数据类别还是分成 3 种类型,因为 Hash 算法会根据你的 Key进行分类,在同一个进程中,无论是有多少过 Task,都会把同样的 Key 放在同一个 Buffer 里,然后把 Buffer 中的数据写入以 Core 数量为单位的本地文件中,(一个 Core 只有一种类型的 Key 的数据),每 1 个 Task 所在的进程中,分别写入共同进程中的 3 份本地文件,这里有 4 个 Mapper Tasks,所以总共输出是 2 个 Cores x 3 个分类文件 = 6 个本地小文件。 

3. SortShuffle解析

3.1. 普通SortShuffle

        在该模式下,数据会先写入一个数据结构,reduceByKey 写入 Map,一边通过 Map 局部聚合,一遍写入内存。Join 算子写入 ArrayList 直接写入内存中。然后需要判断是否达到阈值,如果达到就会将内存数据结构的数据写入到磁盘,清空内存数据结构。 

        在溢写磁盘前,先根据 key 进行排序,排序过后的数据,会分批写入到磁盘文件中。默认批次为 10000 条,数据会以每批一万条写入到磁盘文件。写入磁盘文件通过缓冲区溢写的方式,每次溢写都会产生一个磁盘文件,也就是说一个 Task 过程会产生多个临时文件。 

        最后在每个 Task 中,将所有的临时文件合并,这就是 merge 过程,此过程将所有临时文件读取出来,一次写入到最终文件。意味着一个 Task 的所有数据都在这一个文件中。同时单独写一份索引文件,标识下游各个Task的数据在文件中的索引,start offset和end offset。 

3.2. bypass SortShuffle

bypass 运行机制的触发条件如下:

  • shuffle reduce task 数量小于等于 spark.shuffle.sort.bypassMergeThreshold 参数的值,默认为 200。 
  • 不是聚合类的 shuffle 算子(比如 reduceByKey)。 

        此时 task 会为每个 reduce 端的 task 都创建一个临时磁盘文件,并将数据按 key 进行 hash 然后根据 key 的 hash 值,将 key 写入对应的磁盘文件之中。当然,写入磁盘文件时也是先写入内存缓冲,缓冲写满之后再溢写到磁盘文件的。最后,同样会将所有临时磁盘文件都合并成一个磁盘文件,并创建一个单独的索引文件。 

        该过程的磁盘写机制其实跟未经优化的 HashShuffleManager 是一模一样的,因为都要创建数量惊人的磁盘文件,只是在最后会做一个磁盘文件的合并而已。因此少量的最终磁盘文件,也让该机制相对未经优化的 HashShuffleManager 来说,shuffle read 的性能会更好。 

        而该机制与普通 SortShuffleManager 运行机制的不同在于:不会进行排序。也就是说,启用该机制的最大好处在于,shuffle write 过程中,不需要进行数据的排序操作,也就节省掉了这部分的性能开销。 


注:其他Spark相关系列文章链接由此进 ->  Spark文章汇总 


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

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

相关文章

C语言实现通讯录【文件版】——存档联系人信息

我真的无法对一个追逐梦想的少年生恨 目录 一、源码阅读注意事项 二、文件读取函数及文件读写规则 1.打开文件 2.读写文件 3.关闭文件 大家好,我是纪宁。 上篇文章向大家如何用C语言实现动态版的通讯录,这篇文章将介绍如何用C语言将通讯录的信息写…

2快速入门Spring基于XML的方式注册第一个组件

基于XML的方式注册第一个组件 开发步骤 第一步:创建Maven工程配置生成的pom.xml文件, 添加spring context基础依赖和junit依赖(注意根据Spring官方文档描述,Spring6需要JDK版本17) 当添加Spring的基础依赖spring context之后,Maven会自动关联并引入其…

【嵌入式项目】南海无线通信系统的射频子系统

前言 射频子系统是无线通行系统的重要组成部分之一。 射频子系统主要由天线、射频前端和调制解调器组成。其工作原理如下: 1. 发送端将数字信号转换成高频模拟信号:无线通行系统的控制中心或读卡器产生的一组数字信号需要通过数模转换器将其转换为模拟…

图纸加密软件哪些可以用?哪个好?

图纸加密软件是一种用于保护和加密图纸文件的工具。它们可以对图纸文件进行加密,以确保只有授权的人可以访问和查看这些文件。 图纸加密软件通常提供了多种加密算法和安全性措施,以确保图纸的保密性和安全性。此外,一些图纸加密软件还提供了…

Postman:postman多接口顺序执行

Runner的使用 postman不仅可以单独运行某个接口,postman的 Runner模块可以运行多个接口,可以实现真正意义上的自动化接口测试 Runner的主要功能如下 按顺序调用接口,执行用例; 批量发送请求; 对接口数据进行参数化…

程序员最常用的6大技术博客排行榜

自互联网发展以来,程序员越来越多,相对应的博客、论坛、社区也五花八门,难以抉择。这么多年用过不少博客平台,以下是我总结的一些程序员常用的技术博客网站。 1、CSDN CSDN博客是专业的IT技术发表平台,流量大、资源多…

欧美暖通现状大解析!涂鸦智慧暖通方案,强大的数据管理能力为你打造爆品

作为现代建筑领域中不可或缺的一部分,暖通行业近两年的增长远超行业人士的预期。主要原因在于全球高温频发、能源问题越发突出,各国政府、科技巨头对新能源产业、节能减排等绿色环保产业给予了极大关注和资金投入。 IMARC Group 数据显示,202…

FL Studio是什么软件?FL Studio2023最新更新内容

FL Studio是什么软件 FL Studio是由比利时软件公司Image-Line开发的音乐制作软件,它拥有丰富的音效、合成器、采样器、鼓机等工具。FL Studio支持多种音频文件格式,包括MIDI、MP3、WAV、OGG等,可以帮助用户自由地进行音乐创作。 FL Studio界…

在After Effects 加速渲染的 21个技巧,记得收藏!

如何减少After Effects 渲染时间? 1.升级内存 减少渲染时间的一种有效方法是升级 RAM(随机存取存储器)。RAM 在渲染过程中起着至关重要的作用,因为它存储并快速访问渲染任务所需的数据。增加系统中的 RAM 量可提供更多的数据存储…

【基础架构】刚果商城(congomall)

刚果商城(congomall) 整体架构 公共规约组件 congomall-base-spring-boot-starter META-INF/spring.factories 自动装配 org.springframework.boot.autoconfigure.EnableAutoConfigurationorg.opengoofy.congomall.springboot.starter.base.config.ApplicationBaseAutoConfi…

Webpack原理与实战 --- Webpack 核心特性

如何使用 Webpack 实现模块化打包? 对模块化打包方案或工具的设想或者说是诉求: 能够将散落的模块打包到一起;能够编译代码中的新特性;能够支持不同种类的前端资源模块。 其中最为主流的就是 Webpack、Parcel 和 Rollup 以 We…

Lottie源代码解析

Lottie-iOS Lottie动画的原理: 一个完整动画View,是由很多个子Layer 组成,而每个子Layer主要通过shapes(形状),masks(蒙版),transform三大部分进行动画。Lottie框架通过…

jdk9以上反射报错 , jib 镜像打包添加配置

错误信息: unable to make protected final java.lang.class java.lang.classloader.defineclass 在IDEA中添加: --add-opens java.base/java.langALL-UNNAMED 即可启动 如果用了jib-maven-plugin 发布镜像, 怎么配置这个参数进去呢&…

多表查询进阶

首先两表如下所示 两表结构如下 查询要求 1 所有有门派的人员信息 select *from t_emp right join t_dept on t_emp.deptIdt_dept.id; 2 列出所有用户,并显示其机构信息 select t_emp.name,t_dept.id,t_dept.deptName,t_dept.address,t_dept.CEO from t_emp l…

深蓝学院C++基础与深度解析笔记 第 12 章 类进阶

深蓝学院C基础与深度解析笔记 第 12 章 类进阶 1. 运算符重载 ● 使用 operator 关键字引入重载函数: – 重载不能发明新的运算,不能改变运算的优先级与结合性,通常不改变运算含义 – 函数参数个数与运算操作数个数相同,至少一…

C++模拟实现unordered_map和unordered_set(哈希)

目录 一、unordered系列关联式容器 1.1 unordered_map 1.1.1 unordered_map 1.1.2 unordered_map接口说明 1. unordered_map的容量 2. unordered_map的迭代器 3.unordered_map的元素访问 4. unordered_map的查询 5. unordered_map的修改操作 6. unordered_map的桶操作…

ros::catkin_create_pkg

用下面的命令即可 catkin_create_pkg first_pkg rospy roscpp std_msg -m ur-email-name

HBase(一)HBase v2.2 高可用多节点搭建

最近刚刚完成了HBase相关的一个项目,作为项目的技术负责人,完成了大部分的项目部署,特性调研工作,以此系列文章作为上一阶段工作的总结. 前言 其实目前就大多数做应用的情况来讲,我们并不需要去自己搭建一套HBase的集群,现有的很多云厂商提供的服务已经极大的方便日常的应用使…

接口测试工具——Postman使用详解

目录 Postman简介 Postman主界面 菜单栏 工具栏 请求管理区 环境管理区 请求设计区 发送请求 发送GET请求 Postman发送GET请求 发送表单格式POST请求 发送JSON格式POST请求 发送XML格式POST请求 发送文件上传类型的请求 响应 环境和变量 环境变量设置 环境变量…

【Ceph的介绍】

目录 1、存储基础1、单机存储设备2、单机存储的问题3、商业存储解决方案4、分布式存储(软件定义的存储 SDS)1、分布式存储的类型 2、Ceph 简介3、Ceph 优势4、Ceph 架构5、Ceph 核心组件1、Pool中数据保存方式支持两种类型2、Pool、PG 和 OSD 的关系 6、…