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、最后说明

说明

  1. 使用动态资源调度功能,必须配置External Shuffle Service。如果没有使用External Shuffle Service,Executor被杀时会丢失shuffle文件。
  2. 配置了动态资源调度功能,就不能再单独配置Executor的个数,否则会报错退出。
  3. 使用动态资源调度功能,能保证最少的executor的个数(spark.dynamicAllocation.minExecutors)