主要涉及

--num-executors
--executor-memory
--executor-cores
--conf spark.default.parallelism

服务器节点YARN可用资源

 

注意点

 1. Spark的executor申请资源需要加上堆外内存

# 堆外内存5g以下都是取384m
spark.executor.memoryOverhead	    max(384, executorMemory * 0.07)

spark.executor.memory    默认1g

如果默认情况下,真正申请的资源应该是 1g+384m,但是设置了增量为512m,最后申请资源为 1.5g。

driver的内存设置也是同样。

2. 一个Container开启一个executor

3. dirver会占用一个Container,默认1个core,1G内存

也就是有一个节点会开启一个Container来运行driver,cluster模式AM运行在driver中,默认占用1个core,1G内存。这个节点的资源减少了,所以应该减掉一个executor。

4. 并行度为executor总cores的2-3倍 

 

示例

因为内存比较少,所以先从内存来分配。

单节点18G可用内存,设置每个executor内存2G,那么实际申请资源为2.5G,可以开启 7.2个,也就是7个,总21个。

总87个core,每个executor分配4.14个core,也就是4个core。

考虑AM需要一个Container,这里可以减掉一个executor。

并行度设置为executor总core的2-3倍,即80的2-3倍,160。

--num-executors 20
--executor-memory 2g
--executor-cores 4
--conf spark.default.parallelism=160 \

运行spark-shell测试

spark-shell \
--master yarn \
--deploy-mode client \
--num-executors 20 \
--executor-cores 4 \
--executor-memory 2g

 

Container为21个,是20个executor和1个driver。

cores为81个,20个executor * 4为80,driver默认1个core。

内存52224,20个executor * 2.5 * 1024为51200,driver默认1G(1024m)。

Spark资源优化-LMLPHP

这样CPU和内存使用率达到94.4%。 当然,还可以根据情况继续优化,尽量不要有闲置资源造成浪费。

例如Cluster模式时可以设置driver资源来分配给AM。

--master yarn
--deploy-mode clster
--driver-memory 2g
--driver-cores 4

这样基本达到完全使用。 

或者开启对外内存,这是需要另外的分配空闲内存的。executors共享堆外内存,executor中的task共享executor的堆内内存。

--conf spark.memory.offHeap.enabled=true \
--conf spark.memory.offHeap.size=3072m \

Spark资源优化-LMLPHP

这里的Storage Memory是存储内存,根据官网说明

spark.memory.fraction	0.6
# Fraction of (heap space - 300MB) used for execution and storage.

spark.memory.storageFraction	0.5

Spark资源优化-LMLPHP

 

例如

当把Yarn节点内存调整到22G,总内存为66G,87cores

spark-shell \
--master yarn \
--deploy-mode client \
--num-executors 21 \
--executor-cores 4 \
--executor-memory 2560m

 

Spark资源优化-LMLPHP

 

08-13 12:39