Spark中,所谓资源单位一般指的是executors,和Yarn中的Containers一样,在Spark On Yarn模式下,通常使用–num-executors来指定Application使用的executors数量,而–executor-memory和–executor-cores分别用来指定每个executor所使用的内存和虚拟CPU核数。
其实从Spark1.2之后,对于On Yarn模式,已经支持动态资源分配(Dynamic Resource Allocation),这样,就可以根据Application的负载(Task情况),动态的增加和减少executors。
大体按照以下步骤进行相关配置
参考Spark官方文档 外部shuffle服务配置https://spark.apache.org/docs/latest/running-on-yarn.html#configuring-the-external-shuffle-service
环境基本信息
$HADOOP_HOME = /usr/hadoop
$SPARK_HOME = $HADOOP_HOME/spark
spark版本2.1.0
1.将spark目录下的spark-<version>-yarn-shuffle.jar($SPARK_HOME/yarn/spark-2.1.0-yarn-shuffle.jar)copy到hadoop集群的所有节点中,我们环境的对应目录为$HADOOP_HOME、yarn/lib/
2.修改YARN NodeManger配置yarn-site.xml,并copy至各个节点
add spark_shuffle to yarn.nodemanager.aux-services
set yarn.nodemanager.aux-services.spark_shuffle.class to org.apache.spark.network.yarn.YarnShuffleService.
...
<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>
...
3.通过在$HADOOP_HOME/etc/hadoop /yarn-env.sh中设置YARN_HEAPSIZE(默认为1000)来增加NodeManager的堆大小,以避免shuffle期间的垃圾回收问题。
4.重启集群所有NodeManager
5.配置spark-defaults.conf
spark.shuffle.service.enabled true
spark.dynamicAllocation.enabled true
spark.dynamicAllocation.minExecutors 1
spark.dynamicAllocation.maxExecutors 20
spark.shuffle.service.enabled true