spark standalone模式,系统根据机器的数量,核数,来自动启用最大资源来执行任务,当然executor内存还是需要自己配置的,因为默认是1g.
而 spark yarn模式默认只启用2个executor,1 core,那么你再多机器也不能充分利用资源。而spark yarn资源分配又分动态和静态配置两种。
a.spark yarn 集群环境搭建请参考(包括了 hive)
b.spark yarn 日志配置及查看方式(查看集群运行情况就得看日志分析)
1.spark yarn静态资源配置
spark.executor.cores | 1 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.instances | 2 | (启用机器数)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服务