1.yarn关键参数配置

1.yarn中单个nodemanager控制container的个数
(1)yarn.nodemanager.resource.memory-mb
作用:该节点分配nodemanager的资源
该节点最大内存划分出来的给nodemanager使用的内存,若物理内存128G,80%可使用,则内存则配置128*0.8,默认是8G,若可用小于8G,则需要修改。
(2)yarn.nodemanager.vmem-pmem-ratio
作用:虚拟内存的比例,默认是2.1,即每使用1G物理内存,分配2.1的虚拟内存

2.resourceManager
(1)yarn.scheduler.minimum-allocation-mb
作用:单个容器(container)可申请的最小资源,影响到单个节点的container的数量
(2)yarn.scheduler.maximum-allocation-mb
作用:单个容器(container)可申请的最大内存资源,应用在运行时申请的内存不能超过这个配置项值

3.executor堆外内存

spark.yarn.executor.memoryOverhead

作用:executor执行的时候,用的内存可能会超过executor-memoy,所以会为executor额外预留一部分内存。spark.yarn.executor.memoryOverhead代表了这部分内存。这个参数如果没有设置,会有一个自动计算公式(位于ClientArguments.scala中),

其中,MEMORY_OVERHEAD_FACTOR默认为0.1,executorMemory为设置的executor-memory, MEMORY_OVERHEAD_MIN默认为384m。参数MEMORY_OVERHEAD_FACTOR和MEMORY_OVERHEAD_MIN一般不能直接修改,是Spark代码中直接写死的。该参数可以通过 submit脚本进行配置

--conf spark.yarn.executor.memoryOverhead=2048

 

 

2.yarn内存参数计算实例

以spark自带的实例SparkPi 为示例:

yarn的资源配置参数如下:

<property>
       <name>yarn.nodemanager.resource.memory-mb</name>
       <value>12288</value>
    </property>
    <property>
       <name>yarn.scheduler.minimum-allocation-mb</name>
       <value>1024</value>
    </property>
    <property>
       <name>yarn.scheduler.maximum-allocation-mb</name>
       <value>10240</value>
    </property>

2.1 spark on yarn-client 

SparkPi的提交代码如下

./spark-submit --class org.apache.spark.examples.SparkPi \
    --master yarn-client  \
    --num-executors 3 \
    --driver-memory 2g \
    --executor-memory 1g \
    --executor-cores 2 \
     /home/hdfs/spark-2.4.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.0.jar \
    200000

本次运行的driver端的2g,3个executeor每个executor1g,在yarn中的申请的资源情况如下图,申请了4container,共申请了7个G的内存:

spark内存设置多大合适 spark on yarn 内存_jar

yarn-client计算公式:

total memory = (executor-memory + spark.yarn.executor.memoryOverhead) * num-executors + (spark.yarn.am.memory + spark.yarn.am.memoryOverhead)

spark.yarn.executor.memoryOverhead由于是默认值,spark.yarn.executor.memoryOverhead的默认值计算公式如下,

即spark.yarn.executor.memoryOverhead=max(1024*0.1,384)=384M:

max(executor-memory*0.1,384)

由于yarn.scheduler.minimum-allocation-mb为1024吗, container的自小申请为1024M的倍数,注意:向上取整是yarn.scheduler.minimum-allocation-mb参数的倍数为因此每个executor申请的内存为:

(1024+384)按照1g取整为2g,3个executor的内存为6G。

spark.yarn.am.memory为默认值512M+spark.yarn.executor.memoryOverhead为384M按照1G取整为1g,因为client模式driver在提交的机器上启动,因此与提交命令中的driver-memory参数无关

ceil((1024+384)/1024)*3 +ceil((512+384)/1024)=7G

2.2 spark on yarn-cluster

SparkPi提交的命令如下

./spark-submit --class org.apache.spark.examples.SparkPi \
    --master yarn-cluster  \
    --num-executors 3 \
    --driver-memory 2g \
    --executor-memory 1g \
    --executor-cores 2 \
     /home/hdfs/spark-2.4.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.4.0.jar \
    200000

本次运行的driver端的2g,3个executeor每个executor1g,在yarn中的申请的资源情况如下图,申请了4container,共申请了9个G的内存:

spark内存设置多大合适 spark on yarn 内存_jar_02

yarn-cluster计算公式:

total memory = (executor-memory + spark.yarn.executor.memoryOverhead) * num-executors + (spark.driver.memory + spark.yarn.am.memoryOverhead)

spark.yarn.executor.memoryOverhead由于是默认值,spark.yarn.executor.memoryOverhead的默认值计算公式如下,

即spark.yarn.executor.memoryOverhead=max(1024*0.1,384)=384M:

executor计算与yarn-client的计算方式一致,(1024+384)按照1g取整为2g,3个executor的内存为6G

driver内存计算为:ceil((2048+384)/1024)=3g

因此yarn-client的申请内存为:ceil((1024+384)/1024)*3 +ceil((2048+384)/1024)=9G