spark动态资源分配

来源:互联网 发布:安乡论坛网络问政 编辑:程序博客网 时间:2024/05/20 11:24

1.简介

前段时间仓库间推广spark-sql时,生产环境已经应用了spark dynamic resource allocation特性,即可动态的资源分配,这里的动态和资源分配是指executor级的,我们知道spark的资源分配是比较coarse-grained的,一个spark作业不同stage之间task数量有时差异比较大,特别是最后stage的时候,有些作业数据稍微倾斜一下,那就有大量的executor是在空闲状态,造成集群资源的极大浪费,通过动态资源分配,已经空闲的executor,如果超过了timeout时间,即可回收资源,而不是继续占用资源;

2.DRA配置安装

可参照官网http://spark.apache.org/docs/1.6.3/job-scheduling.html#dynamic-resource-allocation

1.首先找到spark版本的spark-<version>-yarn-shuffle.jar shuffle包,并将该包放到集群所有NodeManager的classpath下,比如放到HADOOP_HOME/share/hadoop/yarn/lib

2.在所有节点的yarn-site.xml中NodeManager上运行的附属服务中加入spark_shuffle及对应的class类,如下:

        <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.重启所有的Nodemanager

即可配置安装好spark的动态资源的分配;

3.spark作业配置

 spark动态资源分配默认是不开启的,并且只要设置了num-executors设置了作业的executor数,就不再有效;

 作业中设置,需要在conf中加入以下配置项:

 spark.dynamicAllocation.enabledfalse是否要开启DRA功能,要开启则设置为true,设置为true需要将spark.shuffle.service.enabled
设置为true;
spark.dynamicAllocation.executorIdleTimeout60sexecutor空闲多长时间就被移除释放spark.dynamicAllocation.cachedExecutorIdleTimeoutinfinity这个要考虑cache数据的时候,有cache数据要空闲多长时间才能移除;默认无限,首先保证cache的数据后面操作需要的时候是不能移除的,这个要注意;spark.dynamicAllocation.initialExecutorsspark.dynamicAllocation.minExecutors初始化的executor数spark.dynamicAllocation.maxExecutorsinfinity动态的时候最多executor数spark.dynamicAllocation.minExecutors0动态的时候最少executor数spark.dynamicAllocation.schedulerBacklogTimeout1s表示积压多久任务的时候要新申请executorspark.dynamicAllocation.sustainedSchedulerBacklogTimeoutschedulerBacklogTimeout如:

spark-submit \
--master yarn \
--deploy-mode cluster \
--executor-cores 3 \
--executor-memory 10G \
--driver-memory 4G \

--conf spark.dynamicAllocation.enabled=true \
--conf spark.shuffle.service.enabled=true \

--conf spark.dynamicAllocation.initialExecutors=5 \
--conf spark.dynamicAllocation.maxExecutors=40 \
--conf spark.dynamicAllocation.minExecutors=0 \
--conf spark.dynamicAllocation.executorIdleTimeout=30s \
--conf spark.dynamicAllocation.schedulerBacklogTimeout=10s \


另外注意:

资源动态控制,spark-core、spark-sql以及机器学习等task需要相对长时间且有差异的作业,Spark Streaming是按照批处理间隔数据流来处理的,对数据处理速率有要求,而不是粗粒度的资源的动态分配;