【大数据学习 | Spark-Core】详解Spark的Shuffle阶段
1. shuffle前言
对spark任务划分阶段,遇到宽依赖会断开,所以在stage 与 stage 之间会产生shuffle,大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。
负责shuffle过程的执行、计算和处理的组件主要就是ShuffleManager,也即shuffle管理器。而随着Spark的版本的发展,ShuffleManager也在不断迭代。
ShuffleManager 大概有两个: HashShuffleManager 和 SortShuffleManager。
历史:
在spark 1.2以前,默认的shuffle计算引擎是HashShuffleManager;
在spark 1.2以后的版本中,默认的ShuffleManager改成了SortShuffleManager;
在spark 2.0以后,抛弃了 HashShuffleManager。
2. HashShuffleManager

上游 stage 有 2个 Executor,每个Executor 有 2 个 task。
下游 stage 有 3个task。
shuffle write阶段:
将相当于mapreduce的shuffle write, 上游的mapTask任务的数据按照key的hash 分桶,写出中间文件(个数为下游reduceTask的任务,即下游RDD分区的个数)。
写出中间文件个数 = maptask的个数 * reducetask的个数。
shuffle read 阶段:
就相当于mapreduce 的 shuffle read, 每个reducetask 拉取自己的数据。
由于shuffle write的过程中,task给下游stage的每个task都创建了一个磁盘文件,因此shuffle read的过程中,每个reducetask只要从上游stage的所有maptask所在节点上,拉取属于自己的那一个磁盘文件即可。
弊端:
shuffle write阶段占用大量的内存空间,会导致频繁的GC,容易导致OOM(out of memory);也会产生大量的小文件,写入过程中会产生大量的磁盘IO,性能受到影响。适合小数据集的处理。
3. HashShuffleManager 优化

开启consolidate机制。
设置参数:spark.shuffle.consolidateFiles。该参数默认值为false,将其设置为true即可开启优化机制。
shuffle write阶段:
我们知道,如果executor的个数为5个,一个executor上的核心是1个,有10个分区的数据要处理,即一个核心要处理2个任务。
开启consolidate机制后,上游的每个mapTask任务的数据仍然按照key的hashCode值分桶,但每个任务并不会形成很多个中间小文件,而是对于每个executor的每个核来说,只会产生下游reduceTask个数的文件。优化后,HashShuffleManager允许上游的交给由一个executor的一个core处理的多个maptask任务的数据以追加形式写入文件组,这样就可以有效将多个task的磁盘文件进行一定程度上的合并,从而大幅度减少磁盘文件的数量,进而提升shuffle write的性能。
写出中间文件个数 = 上游的CPU核数 * 下游task的个数
shuffle read 阶段:
就相当于mapreduce 的 shuffle read, 每个reducetask 拉取自己的数据。
由每个reducetask只要从上游stage的所在节点上,拉取属于自己的那一个磁盘文件即可。
弊端:
优化后的HashShuffleManager,虽然比优化前减少了很多小文件,但在处理大量数据时,还是会产生很多的小文件。
4. SortShuffleManager
Spark在引入Sort-Based Shuffle以前,比较适用于中小规模的大数据处理。为了让Spark在更大规模的集群上更高性能处理更大规模的数据,于是就引入了SortShuffleManager。

shuffle write阶段:
shuffle操作之前,数据会被划分为多个分区。每个分区被发往不同的executor进行计算。在map阶段,每个executor会根据key的hashCode值将数据进行分桶产生小文件。每个桶对应的一个下游分区。在每个桶中,数据会被按照key进行局部排序(这个操作不是必须的),排序后这些小文件会写入到内存中的一个大的shuffle文件。在写入shuffle文件的同时,会生成一个index索引文件。索引文件可以快速定位和读取所需要的键值对数据,而不需要扫描整个文件。
SortShuffleManager不会为每个Reducer中的Task生成一个单独的文件,相反,会把上游中每个mapTask所有的输出数据Data只写到一个文件中。并使用了Index文件存储具体 mapTask 输出数据在该文件的位置。
因此 上游 中的每一个mapTask中产生两个文件:Data文件 和 Index 文件,其中Data文件是存储当前Task的Shuffle输出的,而Index文件中存储了data文件中的数据通过partitioner的分类索引。
写出文件数 = maptask的个数 * 2 (index 和 data )
可见,SortShuffle 的产生的中间文件的多少与 上个stage 的 maptask 数量有关。
shuffle read 阶段:
下游的Stage中的Task就是根据这个Index文件获取自己所要抓取的上游Stage中产生的数据。
在sortShuffleManager中,我们可以启动byPass机制,不排序的机制。开关的值默认是mapTask的个数是200.
触发bypass机制的条件:
shuffle map task的数量小于spark.shuffle.sort.bypassMergeThreshold参数的值(默认200)或者不是聚合类的shuffle算子(比如groupByKey)
5. 总结
回顾整个Shuffle的历史,Shuffle产生的临时文件的数量的变化以此为:
Hash Shuffle:M*R;
Consolidate 方式的Hash Shuffle:C*R;
Sort Shuffle:2*M;
其中:M:上游stage的task数量,R:下游stage的task数量,C:上游stage运行task的CPU核数
相关文章:
【大数据学习 | Spark-Core】详解Spark的Shuffle阶段
1. shuffle前言 对spark任务划分阶段,遇到宽依赖会断开,所以在stage 与 stage 之间会产生shuffle,大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。 负责shuffle…...
如何启动 Docker 服务:全面指南
如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…...
使用client-go在命令空间test里面对pod进行操作
目录 一、获取使用restApi调用的token信息 二、client-go操作pod示例 1、获取到客户端 2、创建pod 3、获取test命令空间的所有pod 4、获取某个具体pod的详细信息 5、更新pod 6、删除pod 三、总结 官方参考地址:https://kubernetes.io/docs/reference/kuber…...
Linux中网络文件系统nfs使用
一、nfs服务 NFS(Network File System) 是一种用于在网络中共享文件的协议,允许不同操作系统(如 Linux、Unix、MacOS 等)之间进行文件共享。 NFS 的工作原理基于客户端-服务器模型,服务器提供共享文件系统…...
气膜建筑:打造全天候安全作业空间,提升工程建设效率—轻空间
在现代建筑工程中,施工环境的管理和作业效率是决定项目进度和质量的关键因素。然而,施工过程中常常会受到天气变化的影响,诸如大风、雨雪、沙尘等恶劣天气常常延误工期,增加施工难度。为了解决这一问题,气膜建筑以其独…...
【HarmonyOS学习日志(10)】一次开发,多端部署之功能级一多开发,工程级一多开发
功能级一多开发 SysCap机制介绍 HarmonyOS使用SysCap机制(即SystemCapability),可以帮助开发者仅关注设备的系统能力,而不用考虑成百上千种具体的设备类型。 在过去,开发不同设备上的应用就用不同设备的SDK进行开发&…...
dmdba用户资源限制ulimit -a 部分配置未生效
dmdba用户资源限制ulimit -a 部分配置未生效 1 环境介绍2 数据库实例日志报错2.1 mpp01 实例日志报错2.2 mpp02 实例日志报错 3 mpp02 服务器资源限制情况4 关闭SELinux 问题解决4.1 临时关闭 SELinux4.2 永久关闭 SELinux 5 达梦数据库学习使用列表 1 环境介绍 Cpu x86 Os Ce…...
【Code First】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 …...
如何在谷歌浏览器中切换DNS服务器
在浏览网页时,DNS(域名系统)服务器的作用是将您输入的网址转换为计算机可以理解的IP地址。有时,您可能需要更改默认的DNS服务器以提升网络速度或解决访问问题。本文将详细介绍如何在谷歌浏览器中切换DNS服务器,并在此过…...
Spring Cloud Stream实现数据流处理
1.什么是Spring Cloud Stream? Spring Cloud Stream的核心是Stream,准确来讲Spring Cloud Stream提供了一整套数据流走向(流向)的API, 它的最终目的是使我们不关心数据的流入和写出,而只关心对数据的业务处…...
列表上移下移功能实现
后台管理某列表需实现上移下移功能,并与前端展示列表排序相关。 现将开发完成过程笔记记录下来。 目录 列表增加属性 JQuery脚本 服务端 控制器 服务层 总结 列表增加属性 在循环渲染时,在table表格的tr上增加id和排序的属性值,以便传…...
升级智享 AI 直播三代:领航原生直播驶向自动化运营新航道
在瞬息万变的数字商业世界,直播行业恰似一艘破浪前行的巨轮,原生直播作为初始 “航船”,在历经风雨后,终于迎来智享 AI 直播三代这股强劲 “东风”,校准航向,开启自动化运营的全新航道,驶向一片…...
Llmcad: Fast and scalable on-device large language model inference
题目:Llmcad: Fast and scalable on-device large language model inference 发表于2023.09 链接:https://arxiv.org/pdf/2309.04255 声称是第一篇speculative decoding边缘设备的论文(不一定是绝对的第一篇),不开源…...
Hbase2.2.7集群部署
环境说明 准备三台服务器,分别为:bigdata141(作为Hbase主节点)、bigdata142、bigdata143确保hadoop和zookeeper集群都先启动好我这边的hadoop版本为3.2.0,zookeeper版本为3.5.8 下载安装包 下载链接:In…...
【青牛科技】D1671 75Ω 带4级低通滤波的单通道视频放大电 路芯片介绍
概 述 : D1671是 一 块 带 4级 低 通 滤 波 的 单 通 道 视 频 放 大 电 路 , 可 在3V或5V的 低 电 压 下 工 作 。 该 电 路 用 在 有 TV影 象 输 出 功 能 的 产 品 上 面,比如 机 顶 盒 ,监 控 摄 象 头 ,DVD&#…...
[NeurIPS 2022] Leveraging Inter-Layer Dependency for Post-Training Quantization
Contents IntroductionMethodExperimentsReferences Introduction 作者提出一种端到端的 PTQ 训练策略 Network-Wise Quantization (NWQ),并通过 Annealing Softmax (ASoftmax) 和 Annealing Mixup (AMixup) 改进了 AdaRound,降低了训练收敛难度 Metho…...
ubuntu+ROS推视频流至网络
目录 概述 工具 ros_rtsp 接受流 web_video_server 源码安装 二进制安装 ros接收rtsp视频流 总结 概述 ros_rtsp功能包可以将ros视频流以rtsp形式推送 web_video_server功能包可以将ros视频话题推HTTP流 rocon_rtsp_camera_relay可以接受同一网段下的rtsp视频流输出为…...
PHP 去掉特殊不可见字符 “\u200e“
描述 最近在排查网站业务时,发现有数据匹配失败的情况 肉眼上完全看不出问题所在 当把字符串 【M24308/23-14F】复制出来发现 末尾有个不可见的字符 使用删除键或左右移动时才会发现 最后测试通过 var_dump 打印 发现这个"空字符"占了三个长度 …...
深度学习—BP算法梯度下降及优化方法Day37
梯度下降 1.公式 w i j n e w w i j o l d − α ∂ E ∂ w i j w_{ij}^{new} w_{ij}^{old} - \alpha \frac{\partial E}{\partial w_{ij}} wijnewwijold−α∂wij∂E α为学习率 当α过小时,训练时间过久增加算力成本,α过大则容易造成越过最…...
elasticsearch8.16 docker-compose 多机器集群安装
在网上找了一圈, 发现要么就是单机版的部署了多个节点, 很少有多台机器部署集群的, 有些就拿官网的例子写一写, 没有实战经验, 下面分享一个教程, 实实在在的多台机器, 每台机器部署2个节点的例子 先上.env , docker-compose.yml文件, 这个文件是核心, 里面掺杂太多坑, 已经帮你…...
大厂面试必问:Nacos 灵魂 18 问,这篇文章帮你彻底搞定!
从基础概念到CAP原理,从心跳机制到集群部署,一篇搞定Nacos面试在微服务架构大行其道的今天,Nacos 作为阿里巴巴开源的动态服务发现、配置和服务管理平台,已经成为面试中的必考知识点。无论你是刚入行的初级工程师,还是…...
[特殊字符] 为什么99%的数字孪生都是“假的”?——镜像视界三维重构与视频反演技术重塑空间智能底层逻辑
🚀 为什么99%的数字孪生都是“假的”?——镜像视界三维重构与视频反演技术重塑空间智能底层逻辑如果你接触过数字孪生项目,或者看过相关展示系统,大概率见过这样一种典型场景:一个极具视觉冲击力的三维城市或工业模型&…...
CMock函数模拟全解析:从ExpectAndReturn到Callback的高级用法指南
CMock函数模拟全解析:从ExpectAndReturn到Callback的高级用法指南 单元测试是软件开发中不可或缺的一环,而C语言开发者常常面临一个难题:如何有效地测试那些依赖外部系统或复杂模块的函数?这正是CMock大显身手的地方。作为Ceedlin…...
从无人机航拍到手机扫描:聊聊SfM(运动恢复结构)在实际项目中的选型与避坑指南
从无人机航拍到手机扫描:SfM技术实战选型与避坑指南 当我们需要将一座千年古刹数字化存档,或是为电商平台上的家具产品创建3D展示模型时,运动恢复结构(SfM)技术往往成为首选方案。这项能够从普通照片中重建三维场景的技…...
Asian Beauty Z-Image Turbo效果展示:不同光照角度(侧逆光/伦勃朗光/蝴蝶光)表现
Asian Beauty Z-Image Turbo效果展示:不同光照角度(侧逆光/伦勃朗光/蝴蝶光)表现 在摄影艺术中,光线是塑造人物灵魂的画笔。侧逆光勾勒轮廓,伦勃朗光刻画戏剧,蝴蝶光则带来柔和与优雅。对于专注于东方美学…...
GetQzonehistory:5分钟快速备份QQ空间历史说说的终极指南
GetQzonehistory:5分钟快速备份QQ空间历史说说的终极指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的记忆越来越依赖于在线平台。QQ空间作…...
Hunyuan-MT Pro实操手册:对接LangChain构建带记忆的多轮专业咨询翻译Bot
Hunyuan-MT Pro实操手册:对接LangChain构建带记忆的多轮专业咨询翻译Bot 1. 项目概述与目标 Hunyuan-MT Pro 是基于腾讯混元翻译模型的现代化Web翻译终端,而今天我们要做的是让它变得更智能——通过集成LangChain框架,构建一个具备对话记忆…...
Windows系统下Tesseract OCR与Python结合实战:从安装到文字识别应用
1. Windows系统下Tesseract OCR的安装与配置 第一次接触OCR技术时,我被它的神奇能力震撼到了——居然能让计算机读懂图片里的文字!作为一款开源OCR引擎,Tesseract在文字识别领域已经默默耕耘了十几年。记得我刚开始用的时候还是3.x版本&#…...
Rk3566 yolov5部署(一)Ubuntu系统镜像烧录与串口调试实战
1. 准备工作:硬件与软件清单 在开始RK3566开发板的Ubuntu系统镜像烧录之前,我们需要准备好必要的硬件和软件工具。我刚开始接触这块开发板时,就因为漏掉了几个小配件耽误了一整天时间,所以特别提醒大家要仔细检查以下清单。 硬件部…...
别再只升级OpenSSH了!一次搞懂Linux离线环境下的依赖包管理与编译安装避坑指南
离线环境下的Linux软件编译:从OpenSSH升级到通用依赖管理方法论 当你面对一台无法连接互联网的Linux服务器时,软件升级和安装往往会变成一场噩梦。想象一下:你下载了最新版OpenSSH的源码包,满怀希望地执行./configure,…...
