Spark 2.3.1 Hadoop 3.0.3
1. 背景
Yarn
yarn是一个主从型的计算资源管理系统,包含一个ResourceManager和多个NodeManager。其中ResourceManager负责整个集群的资源调度,管理NodeManager;NodeManager负责管理单个节点。
资源需求提交给yarn后,yarn会按照提交的需求将一定数量的资源(cpu+内存)打包成Container的形式返回。yarn的配置文件中可以设置Container的一些限制,比如最大的内存、最大的cpu数等。如果申请超出了限制,就不会返回Container。
一个分布式的计算任务在yarn上运行时,首先会申请一个Container运行ApplicationMaster。ApplicationMaster相当于计算任务的main函数,负责计算任务的调度,并且与ResourceManager交互,申请计算资源。通常ApplicationMaster会申请多个Container,并在这些Container中运行相应的计算任务。
Spark
Spark是一种分布式计算框架,可以在多种集群资源管理器上运行。Spark计算任务运行时,会首先运行一个driver,相当于计算任务的main函数。它负责计算任务的调度,driver会管理多个executor,executor上会运行具体的计算任务。
Spark程序运行时,可以设置driver、executor的资源需求(核数、内存数);根据这些设置向集群管理器申请资源。
2. Spark on Yarn
Spark在Yarn上运行时有两种模式:client模式和cluster模式,默认是client模式。
client模式
提交Spark程序后,Spark的driver运行在提交程序的主机上(客户端)。driver首先向Yarn申请一个Container运行ApplicationMaster;然后driver通过ApplicationMaster为executor申请Container;最后driver和executor交互,分配计算任务。
cluster模式
cluster模式主要和client模式的主要区别是,Spark的driver也运行在Yarn上,和ApplicationMaster运行在同一个Container里。这样提交Spark计算任务后,客户端就可以退出了,计算任务会继续在Yarn上运行。
3. Executor内存设置
Spark的executor和driver都运行在单独的JVM中。spark.executor.memory这个参量设置的就是JVM的堆内存,也是executor实际可以使用的内存。JVM本身也需要一定的内存,这部分内存的大小通过spark.executor.memoryOverhead设置。这两部分的和就是向Yarn申请的Container内存大小。
Yarn配置文件中会限制Container的最小内存(yarn.scheduler.minimum-allocation-mb)、最大内存(yarn.scheduler.maximum-allocation-mb)。
Container的内存分配大致如下:
- JVM堆外内存:spark.executor.memoryOverhead
- JVM堆内存:spark.executor.memory
- 用于计算(如shuffle操作)和存储
spark.memory.fraction * (JVM堆内存 – 300M)spark.memory.fraction默认值为0.6。这部分内存会有一个比例专门用于存储;这个比例通过spark.memory.storageFraction设置。其他的部分会在运行中动态的调整。 - 用于保存Spark元数据
4. Driver内存设置
driver内存和executor类似也分为堆内和对外,分别通过spark.driver.memory和spark.driver.memoryOverhead设置。计算中对rdd的collect操作会拉到driver里,所以如果有比较大的collect操作,需要更多的driver内存。
需要注意的是client模式和cluster模式下driver内存的设置是有区别的。
client模式
client模式下,任务提交的同时driver就开始运行了。所以driver内存不可以在程序里使用SparkConf类设置,而需要通过配置文件($SPARK_HOME/conf/spark-defaults.conf)或传入参数(–driver-memory等)的方式设置。
同时ApplicationMaster的内存配置使用参数spark.yarn.am.memory
和spark.yarn.am.memoryOverhead
,可以在SparkConf里设置。
cluster模式
cluster模式下可以使用spark.driver.memory
和spark.driver.memoryOverhead
在SparkConf里设置。提交的Container内存申请值是这两者的和,这个Container里会同时运行Spark的driver和Yarn的ApplicationMaster
5. 相关链接
Spark官方文档:
http://spark.apache.org/docs/latest/configuration.html
http://spark.apache.org/docs/latest/running-on-yarn.html
Yarn官方文档:
http://hadoop.apache.org/docs/r3.0.3/hadoop-yarn/hadoop-yarn-common/yarn-default.xml