Spark的Excutor的Container内存有两大部分组成: 堆外内存和Excutor内存
- 堆外内存(spark.yarn.executor.memoryOverhead)
主要用于JVM自身的开销。 默认: MAX(executorMemory * 0.10, 384m)
Excutor内存(spark.executor.memory)
- Execution: shuffle、 排序、 聚合等用于计算的内存
- Storage: 用于集群中缓冲和传播内部数据的内存(cache、 广播变量)
堆外内存: 除了前面介绍的Executor的堆外内存, Driver、 Application Master进程也有堆外内存。
Driver的堆外内存设置
- spark.driver.memoryOverhead
默认: MAX(Driver memory * 0.10, 384m)
Application Master的堆外内存设置
- spark.yarn.am.memoryOverhead
默认: MAX(AM memory * 0.10, 384m)
Application Master的内存也是--conf参数设置。
spark-shell --master yarn \
--master yarn-client \
--num-executors 4 \
--driver-memory 10g \
--executor-memory 3g \
--executor-cores 6 \
--conf spark.yarn.executor.memoryOverhead=1024m \
--conf spark.yarn.am.memory=1000m \
--conf spark.yarn.am.memoryOverhead=600m
从Yarn的管理页面, 分配了5个Container, 25个Cpu Core, 18432M内存
- 占用的CPU Core数
Excutor的Core数 = 4 * 6个core = 24个
AM的Core数默认为1
占用的CPU Core数: Excutor的Core数 + AM的Core数 = 4 * 5 + 1 = 25个。
- 占用的Container数
4个Excutor 进程 + 1个Applicatoin Master进程 = 5个Container
- 占用的资源情况:
1. Excutor的Container内存: 堆外内存 + Excutor内存。
(1) 堆外内存 = 4 * 1024 = 4048M
(2) Excutor内存: 4 * 3 * 1024 = 12288M
Excutor的Container内存: 4096M+ 12288M = 16336M
2. AM(Application Master)的Container内存: 堆外内存 + AM内存
AM内存是1000M, 根据参数参数分配1024M。
堆外内存 = 1024M。
AM内存的Container内存: 1024M + 1024M = 2048M。
总的内存大小: Excutor的Container内存 + AM的Container内存 = 16336M+ 2048M= 18432M
注意: Driver的内存分配在Yarn的管理页面没有体现
1. Application Master, 是一个非Executor的容器, 它会从YARN申请Container运行。 因此, 在考虑spark的资源分
配的时候, 需要将Application Master所需要的内存和cpu core考虑在内。
在yarn client模式, spark版本为1.6, 默认是512M 和 一个vcore。
在yarn cluster模式, driver是运行在application上面, 因此可以设置--driver-memory 和--driver-cores属性强化AM
的资源。
2. 运行的一个executor内存过大通常会导致过多的垃圾回收延迟。 对于单个executor来说, 64GB是一个很好的上限。
3. 最好将executor的core数量保持在5个以下, 即 每个executor 最多可以指定五个任务, 以实现完全的写入吞吐量。
4. 每个executor的core数量太小, 比如一个executor只分配一个core和足够的内存, 这会导致申请非常多的executor。
这个将抛弃使用单个JVM运行多个任务带来的好处。 首先是JVM自身需要开销, 此外广播变量是在每个executor上复
制一次, 如果很多小的executor会导致更多的数据副本。