Spark如何进行动态资源分配
一、操作场景
对于Spark应用来说,资源是影响Spark应用执行效率的一个重要因素。当一个长期运行的服务,若分配给它多个Executor,可是却没有任何任务分配给它,而此时有其他的应用却资源紧张,这就造成了很大的资源浪费和资源不合理的调度。
动态资源调度就是为了解决这种场景,根据当前应用任务的负载情况,实时的增减Executor个数,从而实现动态分配资源,使整个Spark系统更加健康。
二、动态资源策略
1、资源分配策略
开启动态分配策略后,application会在task因没有足够资源被挂起的时候去动态申请资源,这种情况意味着该application现有的executor无法满足所有task并行运行。spark一轮一轮的申请资源,当有task挂起或等待spark.dynamicAllocation.schedulerBacklogTimeout
(默认1s)`时间的时候,会开始动态资源分配;之后会每隔spark.dynamicAllocation.sustainedSchedulerBacklogTimeout(默认1s)时间申请一次,直到申请到足够的资源。每次申请的资源量是指数增长的,即1,2,4,8等。
之所以采用指数增长,出于两方面考虑:其一,开始申请的少是考虑到可能application会马上得到满足;其次要成倍增加,是为了防止application需要很多资源,而该方式可以在很少次数的申请之后得到满足。
2、资源回收策略
当application的executor空闲时间超过spark.dynamicAllocation.executorIdleTimeout(默认60s)
后,就会被回收。
三、操作步骤
1、yarn的配置
首先需要对YARN进行配置,使其支持Spark的Shuffle Service。
修改每台集群上的yarn-site.xml:
1 2 3 4 5 | - 修改 <property> <name>yarn.nodemanager.aux-services< /name > <value>mapreduce_shuffle,spark_shuffle< /value > < /property > |
1 2 3 4 5 6 7 8 9 | - 增加 <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 > |
将$SPARKHOME/lib/spark-X.X.X-yarn-shuffle.jar拷贝到每台NodeManager的${HADOOPHOME}/share/hadoop/yarn/lib/下, 重启所有修改配置的节点。
2、Spark的配置
配置$SPARK_HOME/conf/spark-defaults.conf,增加以下参数:
1 2 3 4 5 6 7 | spark.shuffle.service.enabled true // 启用External shuffle Service服务 spark.shuffle.service.port 7337 //Shuffle Service默认服务端口,必须和yarn-site中的一致 spark.dynamicAllocation.enabled true // 开启动态资源分配 spark.dynamicAllocation.minExecutors 1 // 每个Application最小分配的executor数 spark.dynamicAllocation.maxExecutors 30 // 每个Application最大并发分配的executor数 spark.dynamicAllocation.schedulerBacklogTimeout 1s spark.dynamicAllocation.sustainedSchedulerBacklogTimeout 5s |
四、启动
使用spark-sql On Yarn执行SQL,动态分配资源。以yarn-client模式启动ThriftServer:
1 2 3 4 5 6 7 8 9 | cd $SPARK_HOME /sbin/ . /start-thriftserver .sh \ --master yarn-client \ --conf spark.driver.memory=10G \ --conf spark.shuffle.service.enabled= true \ --conf spark.dynamicAllocation.enabled= true \ --conf spark.dynamicAllocation.minExecutors=1 \ --conf spark.dynamicAllocation.maxExecutors=300 \ --conf spark.dynamicAllocation.sustainedSchedulerBacklogTimeout=5s |
启动后,ThriftServer会在Yarn上作为一个长服务来运行。
作者:WindyQin
出处:http://www.cnblogs.com/qinchaofeng/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!