日志

Spark集群资源动态分配

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,那么动态资源分配将被关闭

转载请注明出处:

© http://hejunhao.me