Spark ExternalShuffleService 运行原理

Remote Shuffle Service简介及社区开发进展 External Shuffle Service存在的问题 阅读详情

前言

Spark 的 Executor 节点不仅负责数据的计算,还涉及到数据的管理。如果发生了 shuffle 操作,Executor 节点不仅需要生成 shuffle 数据,还需要负责处理读取请求。如果 一个 Executor 节点挂掉了,那么它也就无法处理 shuffle 的数据读取请求了,它之前生成的数据都没有意义了。

为了解耦数据计算和数据读取服务,Spark 支持单独的服务来处理读取请求。这个单独的服务叫做 ExternalShuffleService,运行在每台主机上,管理该主机的所有 Executor 节点生成的 shuffle 数据。有读者可能会想到性能问题,因为之前是由多个 Executor 负责处理读取请求,而现在一台主机只有一个 ExternalShuffleService 处理请求,其实性能问题不必担心,因为它主要消耗磁盘和网络,而且采用的是异步读取,所以并不会有性能影响。

解耦之后,如果 Executor 在数据计算时不小心挂掉,也不会影响 shuffle 数据的读取。而且Spark 还可以实现动态分配,动态分配是指空闲的 Executor 可以及时释放掉。

架构图

下图展示了一个 shuffle 操作,有两台主机分别运行了三个 Map 节点。Map 节点生成完 shuffle 数据后,会将数据的文件路径告诉给 ExternalShuffleService。之后的 Reduce 节点读取数据,就只和 ExternalShuffleService 交互。
在这里插入图片描述

Yarn AuxServices

本篇主要是讲 Spark 运行在 Yarn 的场景,ExternalShuffleService 是作为 Yan 的辅助服务运行的,这里先讲讲 Yarn 的辅助服务。

Yarn NodeManager 服务启动的时候,会启动一些额外的辅助服务,这些辅助服务的运行周期同 NodeManager 相同。每个辅助服务由 AuxiliaryService 类表示,用户需要继承并实现 AuxiliaryService 类,并且还需要配置 Yarn 的 yarn.nodemanager.aux-services选项,这样才能被 NodeManager 发现。下面添加了 spark_shuffle 名称的服务,并且指定了实现的类名和端口号。

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle, spark_shuffle</value>
</property>

<property>
    <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
    <value>org.apache.spark.network.yarn.YarnShuffleService</value>
</property>

<property>
    <name>spark.shuffle.service.port</name>
    <value>7337</value>
</property>

YarnShuffleService

从上面的配置中,可以看到实现类 是 YarnShuffleService。它本质是运行了一个 Spark Rpc 服务,只处理来自 Map 节点和来自 Reduce 节点的请求。

Map 节点会将生成好的 shuffle 文件路径通知给 ExternalShuffleService ,请求由 RegisterExecutor 表示。
Reduce 节点读取数据的流程,先发送 OpenBlocks 请求获取 streamId,然后通过 streamId 来请求数据。
解析来依次来看看这些请求的原理。

RegisterExecutor 请求

首先看看 RegisterExecutor 请求的格式:

public class RegisterExecutor extends BlockTransferMessage {
    public final String appId;         // spark application id
    public final String execId;        // executor id
    public final ExecutorShuffleInfo executorInfo;    // 文件路径
}

因为 ExternalShuffleService 是为同个主机上所有 Executor 服务的,而这台主机上可能同时运行多个 spark 程序,所以需要 appId 用来区分。execId 是用来区分 Executor 节点的。executorInfo 是用来指定数据存储的目录。

继续看看文件路径是怎么定义的:

public class ExecutorShuffleInfo implements Encodable {
    
    public final String[] localDirs;         // 第一级目录列表
    public final int subDirsPerLocalDir;     // 第二级目录列表
    public final String shuffleManager;      // shuffleManager的类型,目前只有一种类型 SortShuffleManager
}

上面只是定义了两级目录,如果想要了解它的含义,就必须了解 shuffle 数据存储位置的规则。

Executor 在 存储 shuffle 数据时,是将它存放在分散的目录,分散的目录是根据文件名的哈希值来确定的。分散的目的是防止单个目录下文件数目过大,造成寻找文件的延迟增大。

我们知道 shuffle 的数据文件名是有着固定的格式的,shuffle_{shuffleId}{mapId}{reduceId}.data,因为目前 shuffle 实现的时候,为了减少文件数过多造成的性能差,会将多份数据合并成一个大文件,对应的最终文件名 shuffle_{shuffleId}{mapId}0.data,并且为了快速查找 reduceId 对应的数据位置,还生成了一份索引文件 shuffle{shuffleId}{mapId}_0.index。

YarnShuffleService 服务会将这些位置信息存储到内存中,如果指定了持久化,会保存到 leveldb 中。

客户端读取

客户端会根据数据的所在节点,流程同普通的一样,只不过普通是向 Executor 进程发送请求,而这里是向 YarnShuffleService 发出读取请求。它分为两部请求:OpenBlocks 请求 和数据传输请求。

OpenBlocks 请求

public class OpenBlocks extends BlockTransferMessage {
    public final String appId;    // spark application id
    public final String execId;   // executor id
    public final String[] blockIds;    // 包含shuffleId,mapId,reduceId 的字符串列表
}

YarnShuffleService 会根据请求的数据,找到对应的文件路径,并且根据 reduceId 从索引文件中,找到数据所在的文件偏移值。

数据传输请求

客户端根据第一步返回的streamId 和 chunkId 列表,向 YarnShuffleService 发送数据传输请求。

spark外置external shuffle service使用介绍 默认情况下,MR任务shuffle都是由当前任务内部完成的,也就是启动了一个spark job,这个job在内部就可完成整个shuffle流程,也就是实时对接的模式,类似快递小哥送快递给你,到你家楼下打电话给你,不见你面他就一直等着你,直到你来了之后,他把快递亲自交到你的手中,他才可以去干下一件快递的排送,这种模式就是默认shuffle的工作原理。外部独立的shuffle服务的存储可以不占用YARN内部的本地磁盘,使用独立的SSD磁盘或者SSD的云存储再配上100G的网络带宽来加速shuffle处理性能。 阅读详情

相关推荐

Spark架构深度解析:DAG执行、Shuffle机制与内存协同原理

Apache Spark 不是简单的内存版 MapReduce,而是一种基于有向无环图(DAG)的分布式执行模型重构。其核心在于逻辑计划到物理任务的动态编译、宽窄依赖驱动的 stage 划分、以及 Driver 与 Executor 间松耦合的事件驱动契约。Shuffle 并非单纯数据搬运,而是由 Shuffle Manager 主导的元数据寻址与 Netty 直连传输协同完成;内存管理则采用堆内/堆外双轨制,强调 Storage 与 Execution 内存的动态博弈而非静态分配。这些机制共同决定了作业稳

weixin_33897367的博客 239

Spark Shuffle Service简介与测试

Spark Shuffle Service 简介与测试

跟着大数据和AI去旅行 2449

从Spark Shuffle RDD到Shuffle Service on Yarn 源码阅读 一

@TOC从Spark Shuffle RDD到Shuffle Service on Yarn 源码阅读 从Spark Shuffle RDD到Shuffle Service on Yarn 源码阅读 涉及内容从Task执行,到RDD的读取,以及Shuffle数据的获取。 Task体系 ShuffleMapTask的读和写 Shuffle Block的读和写 External Shuffle Ser...

心中永远的正能量 900

spark动态资源调度中的shuffle service的数据清理

但在不同的集群部署方案中,如 YARN,Mesos,Standalone配置外部的 shuffle 服务的方式都不一样,每当有新的部署方案,例如支持 Kubernetes 集群,都需要实现对应的 shuffle 服务以支持动态资源分配,可以看到动态资源分配与资源集群耦合太紧,从而限制其灵活性。动态分配根据任务数量生成的最大并行度,默认提供最大并行度,该为 0.5 则降低一半新增的 executor 的数量,对某些小任务会提高资源利用率,受minExecutors和maxExecutors值的影响。

三劫散仙 1126

Spark external shuffle service

对于spark on yarn,shuffle write是container写数据到本地磁盘(路径由core-site.xml中hadoop.tmp.dir指定)过程;shuffle read是container请求external shuffle服务获取数据过程,external shuffle是NodeManager进程中的一个服务,默认端口是7337,或者通过spark.shuffle.service.port指定。

zhixingheyi_tian的博客 273

CHNS数据库下载与使用指南:从申请到导入的全流程解析

面板数据是经济学与公共卫生实证研究的重要支撑。中国健康与营养调查(CHNS)自1989年持续追踪中国居民的家庭与个人健康、营养及经济行为,为研究者提供了跨度近三十年的纵向微观数据。理解CHNS的数据组织原理与申请机制,是高效利用该数据的前提。该数据广泛适用于健康经济学、膳食营养分析及公共政策评估等场景。围绕CHNS的下载流程,完整梳理了注册申请、数据文件解析以及Stata、R、Python三种工具的读取方法,并针对邮箱验证、文件损坏、ID匹配等常见问题提供排查建议,帮助研究者快速建立数据处理基础。

weixin_33624741的博客 283

spark的动态资源配置

spark的动态资源配置 对于Spark应用来说,资源是影响Spark应用执行效率的一个重要因素。当一个长期运行 的服务(比如Thrift Server),若分配给它多个Executor,可是却没有任何任务分配给它,而此时有其他的应用却资源张,这就造成了很大的资源浪费和资源不合理的调度。 ​ 动态资源调度就是为了解决这种场景,根据当前应用任务的负载情况,实时的增减 Executor个数,从...

初学者 1225

DDS(Direct Digital Synthesizer)数字频率合成器

随着数字技术在仪器仪表和通信系统中的广泛使用,可从参考频率源产生多个频率的数 字控制方法诞生了,即直接数字频率合成(DDS)。 直接数字合成(DDS)是一种产生模拟波形(通常是正弦波)的方法,它通过产生数字形式的时变信号,然后进行数模转换。由于DDS设备内的操作主要是数字的,它可以提供输出频率之间的快速切换,良好的频率分辨率,并在广泛的频率频谱上操作。随着设计和工艺技术的进步,今天的DDS设备非常紧凑,功耗很小。 上面是比较书面的语言,其实简单地说就是一个信号发生器模块,主要是产生频率可调的三角波正弦波。

denghuajing的博客 4863

Spark为何使用Netty通信框架替代Akka

导读 一直以来,基于Akka实现的RPC通信框架是Spark引以为豪的主要特性,也是与Hadoop等分布式计算框架对比过程中一大亮点,但是时代和技术都在演化,从Spark1.3.1版本开始,为了解决大块数据(如Shuffle)的传输问题,Spark引入了Netty通信框架,到了1.6.0版本,Netty居然完全取代了Akka,承担Spark内部所有的RPC通信以及数据流传输。 一、网络IO扫盲...

LINBE_blazers的博客 1315

告别双导航栏!微信小程序web-view嵌入H5的导航栏隐藏实战(附uniapp代码)

本文详细解析了微信小程序中web-view嵌入H5页面时出现的双导航栏问题,并提供了基于uniapp的完整解决方案。通过环境感知、动态适配和样式隔离等技术手段,实现导航栏的无缝整合,提升用户体验和屏幕空间利用率。文章包含实战代码示例和常见问题排查指南,帮助开发者快速解决这一常见痛点。

weixin_26945061的博客 342

树莓派入门教程 - 0 - 准备篇 - 0.0 SD卡制作树莓派系统镜像启动盘 开机

电脑需要提前安装的工具: sd卡格式化工具SDFormatter,官网下载链接:https://www.sdcard.org/downloads/formatter/ 镜像烧录工具Win32 Disk Imager,官网下载链接:https://win32diskimager.download/ 使用到的硬件: 一张容量大于等于16GB的TF卡 + 读卡器; 树莓派板卡。3B、3B+、4B等各型号均可,带有 HDMI接口即可。 HDMI接口的显示屏。 鼠标、键盘、电脑。 1....

Mark_md的博客 6971

Spark任务动态伸缩机制介绍

目录 背景 第一部分 配置实现 第二部分 动态配置原理和源码分析 第三部分 总结 参考文献及资料 背景 Spark默认使用的是资源预分配的模式。即在任务运行之前,需要提前指定任务运行需要的资源量。但是在实际线上生产环境使用过程就存在资源浪费和不足的问题,特别是Spark Streaming类型的任务。例如很多日志数据在一天中量并不是均匀分布的,而是一个“双驼峰”。对于预分配模式,就存在日志峰值期间,运算资源不足导致数据处理的延迟,而在日志低峰时期存在资源闲置却无法释放(特别是资源管理器粗粒度模式)。使

数据科学和工程 1683

YOLO系列专栏(六):YOLO26热力图可视化 | 解析模型推理逻辑,定位检测关键区域

YOLO26作为新一代目标检测模型,其核心优势是高效的特征提取和精准的目标定位,但模型内部的推理过程的“黑盒”特性,给我们的优化带来了很大困扰:❌ 检测精度低:不知道是模型没学到关键特征,还是特征提取不充分;❌ 出现误检/漏检:无法定位问题根源——是锚框不合适?还是特征图未捕捉到目标?❌ 模型优化盲目:调参、修改网络结构全靠“猜”,缺乏针对性;❌ 难以解释模型行为:实际项目中,需要说明模型“为什么检测到这个目标”,尤其是医疗、工业等对可解释性要求高的场景。而热力图可视化。

qq_36130719的博客 731

spark schedulers on driver

DAG调度 - Dependency 窄依赖: 父亲RDD的一个分区数据只能被子RDD的一个分区消费: map, filter, flatMap等 宽依赖:父亲RDD的一个分区的数据同时被子RDD多个分区消费 reduceByKey, groupByKey, coalesce, combineByKey等 DAG调度 – stage调度 调度流程图如下: 任务调度 – taskset内部task...

没有合适的昵称 1740

【软件系统架构】系列四:嵌入式技术

嵌入式系统是以应用为中心、以计算机技术为基础,并将可配置与可裁剪的软硬件集成于一体的专用计算机系统。它需要满足功能、可靠性、成本、体积、功耗等方面的严格要求。 嵌入式系统一般由以下组成部分构成:

moton2017的博客 999

CLCD 中国生命周期基础数据库使用攻略

CLCD 是公共建筑碳排放计算的理想选择,其本地化数据可显著提高计算准确性。

hy行者勇哥的博客 2672

Spark之MetricsSystem

1.看启动start方法,spark中有哪些类调用了MetricsSystem类的start方法   SparkEnv,Master,SparkContext,Worker,ExternalShuffleService,主要讲ExternalShuffleService   ExternalShuffleService:这个类的作用是提供一个服务来读取shuffle程序,可以防止executo...

u014733604的博客 553

AI漫剧全套万能提示词合集

今天给大家整理一套已经跑通爆款漫剧的万能提示词库!覆盖:豆包剧本人设词 + 分镜生成词 + 即梦绘图词 + 动态优化词 + 防翻车固定词直接复制粘贴,新手也能做出稳定、高清、统一、有质感的AI漫剧!你是资深短视频漫剧编剧,擅长制作60秒竖屏爆款AI漫剧,请为我创作一集完整漫剧内容。要求:开头3秒高能抓眼,中段有冲突转折,结尾留强悬念钩子,节奏紧凑、适合短视频流量。首先生成固定统一人物人设:包含脸型、五官、发色、发型、穿搭、身材、气质、画风、光影细节,要求足够精细,保证全程角色不变脸。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 1866

京东Spark自研Remote Shuffle Service在大促中的应用实践

前言本文讨论了京东Spark计算引擎研发团队关于自主研发并落地Remote Shuffle Service,助力京东大促场景的探索和实践。近年来,大数据技术在各行各业的应用越来越广泛,S...

过往记忆大数据 1060

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spark 集群部署与调优 -- 动态资源分配(Dynamic Resource Allocation, DRA)

Spark动态资源分配(DRA)是提升集群资源利用率和作业吞吐量的关键机制,通过按需伸缩Executor资源解决静态配置的资源浪费或不足问题。其核心依赖External Shuffle Service(ESS)保障Executor释放后Shuffle数据可用。工作原理包括:Driver根据任务积压情况动态申请/释放Executor,ESS托管Shuffle数据确保任务连续性。关键配置参数涵盖Executor数量范围、伸缩触发条件及Shuffle数据生命周期管理,需根据业务场景调优。该机制尤其适用于负载波动大

csdn_tom_168的博客 1701

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

从单机到集群:PySpark的SparkContext配置详解,local[*]和yarn模式到底怎么选?

本文详细解析了PySpark中SparkContext的配置选择,重点对比了`local[*]`和`yarn`两种模式的优缺点及适用场景。通过实战案例和性能调优建议,帮助开发者根据数据处理规模、硬件资源和成本效益做出最佳选择,提升分布式计算效率。

crhwkrhpunow61910的博客 322

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SPARK SHUFFLE中 ShuffleId BlockManagerId 以及 与ESS(External Shuffle Server)交互

背景 本文基于SPARK 3.1.2 用来更好的理解spark shuffle中的点点滴滴 分析 我们直接从SortShuffleManager着手,因为这是个shuffle的纽带: override def registerShuffle[K, V, C]( shuffleId: Int, dependency: ShuffleDependency[K, V, C]): ShuffleHandle { ... override def getReader[K, C](

monkeyboy_tech的博客 2119

Spark2.0 shuffle service

Spark 的shuffle 服务是spark的核心,本文介绍了非ExternalShuffleClient的方式,看BlockService的整个架构。ShuffleClient是整个框架的基础,有init方法和fetchBlock两个方法。 /** Provides an interface for reading shuffle files, either from an Execut...

weixin_30462049的博客 328

【华为云技术分享】快速理解spark-on-k8s中的external-shuffle-service

【摘要】 external-shuffle-service是Spark里面一个重要的特性,有了它后,executor可以在不同的stage阶段动态改变数量,大大提升集群资源利用率。但是这个特性当前在k8s上并不能很好的运行。让我们来看看,在k8s上要实现这个external-shuffle-service特性的最新进展吧。 如果你想在kubernetes集群中运行Spark任务,那么你可能会...

华为云官方博客 1909

【spark系列12】spark remote shuffle service(RSS)杂谈

背景 对于spark shuffle service(以下简称RSS),在社区其实早就有探讨SPARK-25299,只不过一直没有达成一致,且目前的内置的shuffle service 也能满足大部分的场景,也就被搁置了,但是由于kubernetes的越来越火热,spark 社区也慢慢的集成了spark on k8s,当然k8s社区也集成了spark,具体区别见spark on k8s 与 spark on k8s operator的对比. 但是就目前的spark on k8s来说shuffle还是存在问题

monkeyboy_tech的博客 4859

Spark 3.2 基于推送的Spark shuffle 服务

[SPARK-30602] SPIP: Support push-based shuffle to improve shuffle efficiency - ASF JIRA (apache.org) [SPARK-36374][SHUFFLE][DOC] Push-based shuffle high level user documentation by venkata91 · Pull Request #33615 · apache/spark · GitHub

lilyjoke的专栏 1958
上一篇: HDFS 客户端读写超时时间解析
下一篇: 数据分析模型思维导图
Viking_bird
博客等级 码龄11年 92粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值