Spark默认采取预分配方式给各个application分配资源,每个application会独占所有分配到的资源直到整个生命周期的结束.对于长周期任务,在workload低峰阶段空闲的资源将一直被抢占而得不到有效利用,无疑是相当浪费.Spark1.2开始引入动态资源分配(Dynamic Resource Allocation)机制,支持资源弹性分配.
动态资源分配
Spark的资源动态分配机制主要基于application的当前任务(task)负载,以executor为粒度(以Spark1.2为例)动态向集群申请或释放资源,这意味着空闲的资源将得到有效的回收,供其他application利用.
Spark1.2仅支持Yarn模式,从Spark1.6开始,支持standalone、Yarn、Mesos.
安装与配置
1. Spark配置
配置 | 设定值 | 备注 |
---|---|---|
spark.dynamicAllocation.enabled | true | 开启动态资源分配 |
spark.dynamicAllocation.minExecutors | <num> | 最少分配executor个数 |
spark.dynamicAllocation.maxExecutors | <num> | 最大分配executor个数 |
spark.dynamicAllocation.executorIdleTimeout | <num> | executor的空闲超时值,当executor空闲超时将被视为可移除 |
spark.shuffle.service.enabled | true | 开启外部shuffle服务,开启这个服务可以保护executor的shuffle文件,安全移除executor,在Yarn模式下这个shuffle服务以org.apache.spark.yarn.network.YarnShuffleService实现 |
2. Yarn配置
- 在所有节点的yarn-site.xml中,为yarn.nodemanager.aux-services配置项新增spark_shuffle这个值(注意是新增,在原有value的基础上逗号分隔新增即可)
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle,spark_shuffle</value> </property>
- 同理在所有节点的yarn-site.xml中,修改yarn.nodemanager.aux-services.spark_shuffle.class的值
<property> <name>yarn.nodemanager.aux-services.spark_shuffle.class</name> <value>org.apache.spark.network.yarn.YarnShuffleService</value> </property>
- 在$SPARK_HOME中找到spark-<version>-yarn-shuffle.jar,将它放到所有NodeManagers的classpath中(或直接放到yarn的lib目录中)
- 重启所有节点
注意
当开启了动态资源分配(spark.dynamicAllocation.enabled),num-executor选项将不再兼容,如果设置了num-executor,那么动态资源分配将被关闭