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的内存:
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的内存:
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