Spark On YARN自动调整Executor数量配置

来源:互联网 发布:搞笑特效软件 编辑:程序博客网 时间:2024/06/05 07:04

Spark On YARN自动调整Executor数量配置 - Dynamic Resource Allocation

原文: http://blog.csdn.net/levy_cui/article/details/51143225


Spark 1.5.2版本支持为Spark On YARN模式的Spark Application根据Task自动调整Executor数,要启用该功能,需做以下操作:

一:在所有的NodeManager中,修改yarn-site.xml,为yarn.nodemanager.aux-services添加spark_shuffle值,设置yarn.nodemanager.aux-services.spark_shuffle.class值为org.apache.spark.network.yarn.YarnShuffleService,如下:
修改:

点击(此处)折叠或打开

  1. <property>
  2. <name>yarn.nodemanager.aux-services</name>
  3. <value>mapreduce_shuffle,spark_shuffle</value>
  4. </property>
添加:

点击(此处)折叠或打开

  1. <property>
  2. <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
  3. <value>org.apache.spark.network.yarn.YarnShuffleService</value>
  4. </property>

  5. <property>
  6. <name>spark.shuffle.service.port</name>
  7. <value>7337</value>
  8. </property>

二:将 $SPARK_HOME/lib/spark-1.5.2-yarn-shuffle.jar 文件拷贝到hadoop/lib (hadoop lib)目录下,我的是/usr/lib/hadoop/lib/这个路径下,有些文章还说拷贝到/usr/lib/hadoop-yarn/lib/(yarn lib)或者软连接处理

备注:
这个操作在所有的 nodemanager 中操作


三:配置 $SPARK_HOME/conf/spark-defaults.conf,内容如下

spark.dynamicAllocation.minExecutors 1 #最小Executor数
spark.dynamicAllocation.maxExecutors 100 #最大Executor数

开启自动调节
spark.dynamicAllocation.enabled true
spark.shuffle.service.enabled true

四:执行时开启自动调整Executor数开关,以spark-sql yarn client模式为例:

spark-sql  --master yarn-client --conf spark.shuffle.service.enabled=true --conf spark.dynamicAllocation.enabled=true -e "SELECT COUNT(*) FROM xx"

这里的--conf spark.shuffle.service.enabled=true --conf spark.dynamicAllocation.enabled=true 如果在spark-defaults.conf设置开启就可以省略了

对于使用spark-submit也是一样:
    spark-submit \
    --class SySpark.SqlOnSpark \
    --master yarn-client \
    --conf spark.shuffle.service.enabled=true \
    --conf spark.dynamicAllocation.enabled=true \
    /data/jars/SqlOnSpark.jar \
    "SELECT COUNT(*) FROM xx"

参考:
http://blog.chinaunix.net/uid-22570852-id-5182664.html
http://lxw1234.com/archives/2015/12/593.htm

https://spark.apache.org/docs/1.5.2/job-scheduling.html#default-behavior-of-pools 


Spark on yarn 支持资源的动态分配。
         
资源请求策略:
    一个spark程序使用轮询来请求资源。具体过程如下:
1.如果程序中有任务在等待,超过spark.dynamicAllocation.schedulerBacklogTimeout参数配置的时间(默认是1s),将会得到新的资源,分配executor
2. 如果等待spark.dynamicAllocation.sustainedSchedulerBacklogTimeout参数配置的时间(默认是1s)后,还有任务在等待,第一步的逻辑将会再次被触发。
注意:每次轮询分配的executor的数目是呈指数增长的:
如第一次申请分配1个executor,第二次申请分配2个executor,第n次申请分配2的n-1次方。
      
资源移除策略:
1.如果spark任务中仍有任务在等待被执行,则这些executor将不会被判定为空闲的。
2.经过spark.dynamicAllocation.executorIdleTimeout参数设定的时间(默认是60s),如果executor仍然没有任务,则会被判定为空闲的。
3.如果executor是空闲的,这个资源就可以被回收。


安全的移除executor:
在不启用动态分配的模式下,executor将会在程序执行完毕之后移除,这个executor的所有状态都将被废弃。但是在动态分配模式下,在程序没有执行完毕,如果一个executor被移除完毕,程序有可能会读取这个executor存储的一些状态,因此spark需要一种机制来安全的移除executors。
这个过程主要是在shuffle过程。在shuffle过程中,executor会将一些输出写到磁盘,然后作为server让其他executors可以获取shuffle的结果文件。为了保护这个过程,spark从1.2开始,提过了一个额外的shuffle服务:org.apache.spark.yarn.network.YarnShuffleService。
   如果这个服务启动,executor将会通过这个服务来获取shuffle文件,而不受executor的影响。



在spark on yarn 配置完毕的基础上
一.配置spark-default.conf

spark.dynamicAllocation.enabled               true
spark.shuffle.service.enabled                    true
这两个参数如果想要生效的话就不能设置spark.executor.instances参数


spark.dynamicAllocation.minExecutors        1
最小分配的executor数量
spark.dynamicAllocation.maxExecutors            infinity
最大分配的executor数量


二 .配置yarn-site.xml,添加spark动态分配和收回executor的服务
 <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>


三.将spark的lib目录里的spark-1.5.2-yarn-shuffle.jar分发到Hadoop集群的每一个安装目录里(可以放置在/usr/local/hadoop/share/hadoop/common/)。


四.重新启动集群的nodemanger服务。

   


0 0