主要涉及
--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)。
这样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 \
这里的Storage Memory是存储内存,根据官网说明。
spark.memory.fraction 0.6
# Fraction of (heap space - 300MB) used for execution and storage.
spark.memory.storageFraction 0.5
例如
当把Yarn节点内存调整到22G,总内存为66G,87cores
spark-shell \
--master yarn \
--deploy-mode client \
--num-executors 21 \
--executor-cores 4 \
--executor-memory 2560m