这几天研究资源分配的时候踩了不少坑,先做以下总结:

1.修改每台NodeManager上的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>

以上若在ambari平台,应该是默认设置好的,

ambari自定义组件添加spark3 ambari spark_动态资源分配


ambari自定义组件添加spark3 ambari spark_动态资源分配_02

2.在spark-defaults.conf

设置

ark.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.shuffle.service.enabled true 配置External shuffle Service服务(一定要配置启用)
spark.shuffle.service.port 7337
spark.dynamicAllocation.enabled true 启用动态资源调度
spark.dynamicAllocation.minExecutors 3 每个应用中最少executor的个数
spark.dynamicAllocation.maxExecutors 8 每个应用中最多executor的个数
可选参数说明:
配置项 说明 默认值
spark.dynamicAllocation.minExecutors 最小Executor个数。 0
spark.dynamicAllocation.initialExecutors 初始Executor个数。 spark.dynamicAllocation.minExecutors
spark.dynamicAllocation.maxExecutors 最大executor个数。 Integer.MAX_VALUE
spark.dynamicAllocation.schedulerBacklogTimeout 调度第一次超时时间。 1(s)
spark.dynamicAllocation.sustainedSchedulerBacklogTimeout 调度第二次及之后超时时间。 spark.dynamicAllocation.schedulerBacklogTimeout
spark.dynamicAllocation.executorIdleTimeout 普通Executor空闲超时时间。 60(s)
spark.dynamicAllocation.cachedExecutorIdleTimeout 含有cached blocks的Executor空闲超时时间。spark.dynamicAllocation.executorIdleTimeout的2倍
说明
1.使用动态资源调度功能,必须配置External Shuffle Service。如果没有使用External Shuffle Service,Executor被杀时会丢失shuffle文件。
2.配置了动态资源调度功能,就不能再单独配置Executor的个数,否则会报错退出。
3.使用动态资源调度功能,能保证最少的executor的个数(spark.dynamicAllocation.minExecutors)
来源:

动态资源分配策略:
开启动态分配策略后,application会在task因没有足够资源被挂起的时候去动态申请资源,这种情况意味着该application现有的executor无法满足所有task并行运行。spark一轮一轮的申请资源,当有task挂起或等待spark.dynamicAllocation.schedulerBacklogTimeout(默认1s)时间的时候,会开始动态资源分配;之后会每隔spark.dynamicAllocation.sustainedSchedulerBacklogTimeout(默认1s)时间申请一次,直到申请到足够的资源。每次申请的资源量是指数增长的,即1,2,4,8等。
之所以采用指数增长,出于两方面考虑:其一,开始申请的少是考虑到可能application会马上得到满足;其次要成倍增加,是为了防止application需要很多资源,而该方式可以在很少次数的申请之后得到满足。

资源回收策略
当application的executor空闲时间超过spark.dynamicAllocation.executorIdleTimeout(默认60s)后,就会被回收。

这里提醒下,实是在spark-defaults.conf下增加,在

ambari自定义组件添加spark3 ambari spark_spark_03


spark2-thrift-sparkconf下也有改配置,该配置是spark2-thrift的配置,通过远程调用的,本地的spark-shell或者pyspark是不生效的,研究了好久,

添加提示

ambari自定义组件添加spark3 ambari spark_ambari自定义组件添加spark3_04


不用管,直接添加就行,提示重复添加,俩不是一个配置文件里的没有影响

配置完后,我启动spark-sql测试(pysaprk和spark-shell一样),

未提交任务情况下

ambari自定义组件添加spark3 ambari spark_ambari自定义组件添加spark3_05


ambari自定义组件添加spark3 ambari spark_ambari自定义组件添加spark3_06


占用集群资源较少,当提交任务后

ambari自定义组件添加spark3 ambari spark_动态资源分配_07


ambari自定义组件添加spark3 ambari spark_ambari自定义组件添加spark3_08


集群资源动态调节,最大话利用集群