写点什么

Spark 如何进行动态资源分配

用户头像
数据社
关注
发布于: 2021 年 05 月 30 日

一、操作场景

对于 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:


 - 修改 <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>
复制代码


{HADOOPHOME}/share/hadoop/yarn/lib/下, 重启所有修改配置的节点。


2、Spark 的配置


配置 $SPARK_HOME/conf/spark-defaults.conf,增加以下参数:


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:


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 上作为一个长服务来运行。

发布于: 2021 年 05 月 30 日阅读数: 22
用户头像

数据社

关注

微信公众号:数据社 2018.04.26 加入

专注大数据架构,数据仓库,MPP数据库分享,微信公众号数据社

评论

发布
暂无评论
Spark如何进行动态资源分配