spark的动态资源配置
对于Spark应用来说,资源是影响Spark应用执行效率的一个重要因素。当一个长期运行 的服务(比如Thrift Server),若分配给它多个Executor,可是却没有任何任务分配给它,而此时有其他的应用却资源张,这就造成了很大的资源浪费和资源不合理的调度。
动态资源调度就是为了解决这种场景,根据当前应用任务的负载情况,实时的增减 Executor个数,从而实现动态分配资源,使整个Spark系统更加健康。
1、External Shuffle Service配置
1、拷贝${SPARK_HOME}/yarn/目录下的spark--yarn-shuffle.jar到${HADOOP_HOME}/share/hadoop/yarn/lib/目录下;
xsync spark-<version>-yarn-shuffle.jar
2、在${HADOOP_HOME}/etc/hadoop/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>
注意:如果 “yarn.nodemanager.aux-services” 配置项已存在,则在 value 中添加 “spark_shuffle”,且用逗号和其他值分开。
2、增大NodeManager的heap size
通过在${HADOOP_HOME}/etc/hadoop/yarn-env.sh文件中设置YARN_HEAPSIZE的值(默认为1000)来实现,此处以配置为6000为例。
xsync yarn-env.sh
3、配置基本参数在spark-defaults.sh
#配置External shuffle Service服务(一定要配置启用)
spark.shuffle.service.enabled true
#启用动态资源调度
spark.dynamicAllocation.enabled true
#每个应用中最少executor的个数
spark.dynamicAllocation.minExecutors 1
#每个应用中最多executor的个数
spark.dynamicAllocation.maxExecutors 3
注:动态资源配置完成后,一定要先重启spark,再重启hadoop,否则会因为端口占用问题导致重启不成功,原因未知。
动态资源可选配置参数如下:
参数名称 | 默认值 | 说明 |
spark.dynamicAllocation.enabled | false | 是否使用动态资源分配,根据工作负载对应用程序executor进行扩展 |
spark.dynamicAllocation.executorIdleTimeout | 60s | 如果启用了动态分配并且executor已经空闲超过这个时间,executor将被释放 |
spark.dynamicAllocation.cachedExecutorIdleTimeout | infinity | 如果启用了动态分配,并且缓存数据块的executor已经空闲了超过这个时间,executor将被释放 |
spark.dynamicAllocation.initialExecutors | spark.dynamicAllocation.enabled | 如果启用动态分配,则要运行executor的初始数量。如果设置了“–num-executors”(或“spark.executor.instances”)并且大于这个值,则会使用这个值进行初始化。 如: max(initialExecuor = 3, –num-executors = 10) 取最大 |
spark.dynamicAllocation.maxExecutors | infinity | 如果启用动态分配,executor的上限个数。必须设置一个数,否则会占用集群所有资源 |
spark.dynamicAllocation.minExecutors | 0 | 如果启用动态分配,executor的下限个数。 |
spark.dynamicAllocation.schedulerBacklogTimeout | 1s | 如果启用动态分配,超过这个时间后还有未完成的积压任务,将会触发再次请求新的executor |
spark.shuffle.service.port | 7337 | shuffle服务监听数据获取请求的端口,可选配置。默认值为:7337 |
4、最后说明
说明
- 使用动态资源调度功能,必须配置External Shuffle Service。如果没有使用External Shuffle Service,Executor被杀时会丢失shuffle文件。
- 配置了动态资源调度功能,就不能再单独配置Executor的个数,否则会报错退出。
- 使用动态资源调度功能,能保证最少的executor的个数(spark.dynamicAllocation.minExecutors)