Spark on Yarn内存设置

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.memoryspark.yarn.am.memoryOverhead,可以在SparkConf里设置。

cluster模式

cluster模式下可以使用spark.driver.memoryspark.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

    原文作者:拿破仑
    原文地址: https://zhuanlan.zhihu.com/p/45027784
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞