0

0

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

看不見的法師

看不見的法師

发布时间:2025-06-27 13:20:13

|

469人浏览过

|

来源于php中文网

原创

前言

资源是影响 Spark 应用执行效率的一个关键因素。Spark 应用中执行任务的组件是 Executor,通过 spark.executor.instances 参数可以设定 Spark 应用的 Executor 数量。在运行过程中,无论 Executor 上是否有任务在执行,它都会被持续占用直到 Spark 应用结束。

在上一篇文章中,我们从动态优化的角度探讨了 Spark 3.0 版本中的自适应查询特性,它主要是在一条 SQL 执行过程中不断优化执行逻辑,选择更优的执行策略,从而提升性能。本篇我们将从整个 Spark 集群资源的角度探讨一个常见问题:资源不足。

在 Spark 集群中,随着业务的发展,运行的 Spark 应用数量和数据量不断增加,单纯依靠增加资源的优化方式变得越来越不现实。当一个长期运行的 Spark 应用被分配了多个 Executor,但这些 Executor 上却没有任务在执行,而此时其他 Spark 应用却面临资源紧张,这就导致了资源浪费和调度不合理。

如果每个 Spark 应用的 Executor 数量能够动态调整就好了。

动态资源分配(Dynamic Resource Allocation)正是为了解决这种情况而设计的。在 Spark 2.4 版本中,Kubernetes 上的动态资源分配功能并不完善,但在 Spark 3.0 版本中,Spark on Kubernetes 的功能得到了完善,包括更灵敏的动态分配。我们的 Erda FDP 平台(Fast Data Platform)从 Spark 2.4 升级到 Spark 3.0,也尝试了动态资源分配的相关优化。本文将详细介绍 Spark 3.0 中 Spark on Kubernetes 的动态资源使用情况。

原理

在一个 Spark 应用中,如果某些 Stage 存在数据倾斜,就会导致大量 Executor 处于空闲状态,造成集群资源的极大浪费。通过动态资源分配策略,空闲的 Executor 如果超过了一定时间,就会被集群回收,并在之后的 Stage 需要时再次请求 Executor。

如下图所示,在固定 Executor 数量的情况下,Job1 结束和 Job2 开始之间,Executor 处于空闲状态,造成集群资源的浪费。

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

开启动态资源分配后,在 Job1 结束后,Executor1 空闲一段时间后便被回收;在 Job2 需要资源时再申请 Executor2,实现了集群资源的动态管理。

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

动态分配的原理很容易理解:“按需使用”。当然,一些细节还是需要考虑:

  • 何时新增/移除 Executor
  • Executor 数量的动态调整范围
  • Executor 的增减频率
  • 在 Spark on Kubernetes 场景下,Executor 的 Pod 销毁后,它存储的中间计算数据如何访问

这些注意点在下面的参数列表中都有相应的说明。

参数一览

spark.dynamicAllocation.enabled=true #总开关,是否开启动态资源配置,根据工作负载来衡量是否应该增加或减少executor,默认false
spark.dynamicAllocation.shuffleTracking.enabled=true #spark3新增,之前没有官方支持的on k8s的Dynamic Resouce Allocation。启用shuffle文件跟踪,此配置不会回收保存了shuffle数据的executor
spark.dynamicAllocation.shuffleTracking.timeout #启用shuffleTracking时控制保存shuffle数据的executor超时时间,默认使用GC垃圾回收控制释放。如果有时候GC不及时,配置此参数后,即使executor上存在shuffle数据,也会被回收。暂未配置
spark.dynamicAllocation.minExecutors=1 #动态分配最小executor个数,在启动时就申请好的,默认0
spark.dynamicAllocation.maxExecutors=10 #动态分配最大executor个数,默认infinity
spark.dynamicAllocation.initialExecutors=2 #动态分配初始executor个数默认值=spark.dynamicAllocation.minExecutors
spark.dynamicAllocation.executorIdleTimeout=60s #当某个executor空闲超过这个设定值,就会被kill,默认60s
spark.dynamicAllocation.cachedExecutorIdleTimeout=240s #当某个缓存数据的executor空闲时间超过这个设定值,就会被kill,默认infinity
spark.dynamicAllocation.schedulerBacklogTimeout=3s #任务队列非空,资源不够,申请executor的时间间隔,默认1s(第一次申请)
spark.dynamicAllocation.sustainedSchedulerBacklogTimeout #同schedulerBacklogTimeout,是申请了新executor之后继续申请的间隔,默认=schedulerBacklogTimeout(第二次及之后)
spark.specution=true #开启推测执行,对长尾task,会在其他executor上启动相同task,先运行结束的作为结果

实战演示

无图无真相,下面我们将动态资源分配进行简单演示。

  1. 配置参数

动态资源分配相关参数配置如下图所示:

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

如下图所示,Spark 应用启动时的 Executor 个数为 2。因为配置了

spark.dynamicAllocation.initialExecutors=2

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

海螺语音
海螺语音

海螺AI推出的AI语音生成工具,支持多种语种、情绪和效果。

下载

运行一段时间后效果如下,executorNum 会递增,因为空闲的 Executor 被不断回收,新的 Executor 不断申请。

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

  1. 验证快慢 SQL 执行

使用 SparkThrfitServer 会遇到的问题是一个数据量很大的 SQL 把所有的资源全占了,导致后面的 SQL 都等待,即使后面的 SQL 只需要几秒就能完成。我们开启动态分配策略,再来看 SQL 执行顺序。

先提交慢 SQL:

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

再提交快 SQL:

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

如下图所示,开启动态资源分配后,因为 SparkThrfitServer 可以申请新的 Executor,后面的 SQL 无需等待便可执行。Job7(慢 SQL)还在运行中,后提交的 Job8(快 SQL)已完成。这在一定程度上缓解了资源分配不合理的情况。

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

  1. 详情查看

我们在 SparkWebUI 上可以看到动态分配的整个流程。

登陆 SparkWebUI 页面,Jobs -> Event Timeline,可以看到 Driver 对整个应用的 Executor 调度。如下图所示,显示了每个 Executor 的创建和回收。

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

同时也能看到此 Executor 的具体创建和回收时间。

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

在 Executors 标签页,我们可以看到所有历史 Executor 的当前状态。如下图所示,之前的 Executor 都已被回收,只有 Executor-31 状态为 Active。

「Spark从精通到重新入门(二)」Spark中不可不知的动态资源分配

总结

动态资源分配策略在空闲时释放 Executor,繁忙时申请 Executor,虽然逻辑比较简单,但是和任务调度密切相关。它可以防止小数据申请大资源,Executor 空转的情况。在集群资源紧张,有多个 Spark 应用的场景下,可以开启动态分配达到资源按需使用的效果。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

673

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

344

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1080

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

355

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

670

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

561

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

404

2024.04.29

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.8万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号