spark on yarn资源分配性能调优(静态和动态)

spark | 2020-03-06 16:25:47

spark standalone模式,系统根据机器的数量,核数,来自动启用最大资源来执行任务,当然executor内存还是需要自己配置的,因为默认是1g.

而 spark yarn模式默认只启用2个executor,1 core,那么你再多机器也不能充分利用资源。而spark yarn资源分配又分动态和静态配置两种。


a.spark yarn 集群环境搭建请参考(包括了 hive)hive on spark集群环境搭建


b.spark yarn 日志配置及查看方式(查看集群运行情况就得看日志分析)

spark on yarn日志配置及webUI界面日志查看


1.spark yarn静态资源配置

spark.executor.cores1 in YARN mode, all the available cores on the worker in standalone and Mesos coarse-grained modes.(每台机器线程数)The number of cores to use on each executor. In standalone and Mesos coarse-grained modes, for more detail, see this description.
spark.executor.instances2(启用机器数)The number of executors for static allocation. With spark.dynamicAllocation.enabled, the initial set of executors will be at least this large.

根据spark yarn 官方文档默认只启用2台机器1核。

所以需要再spark-default.xml中配置:

#执行任务时同时25个running
spark.executor.cores                   5
spark.executor.instances               5


另外还有spark.executor.memory可以配置,注意单机器线程数*分块数量占用内存<=机器物理内存


2.spark yarn动态资源分配策略

动态分配资源请求策略:

2.1一个spark程序使用轮询来请求资源。具体过程如下:

1).如果程序中有任务在等待,超过spark.dynamicAllocation.schedulerBacklogTimeout参数配置的时间(默认是1s),将会得到新的资源,分配executor

2). 如果等待spark.dynamicAllocation.sustainedSchedulerBacklogTimeout参数配置的时间(默认是1s)后,还有任务在等待,第一步的逻辑将会再次被触发。

注意:每次轮询分配的executor的数目是呈指数增长的:如第一次申请分配1个executor,第二次申请分配2个executor,第n次申请分配2的n-1次方。

      

2.2资源移除策略:

1).如果spark任务中仍有任务在等待被执行,则这些executor将不会被判定为空闲的。

2).经过spark.dynamicAllocation.executorIdleTimeout参数设定的时间(默认是60s),如果executor仍然没有任务,则会被判定为空闲的。

3).如果executor是空闲的,这个资源就可以被回收。

4).安全的移除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的影响。


3.spark yarn动态资源分配配置

3.1.配置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数量

3.2 .配置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>


3.3.将spark的lib目录里的spark-1.5.2-yarn-shuffle.jar分发到hadoop集群的每一个安装目录里

(可以放置在/usr/local/hadoop/share/hadoop/common/)。


3.4.重新启动集群的nodemanger服务


登录后即可回复 登录 | 注册
    
关注编程学问公众号