本文主要了解Spark On YARN部署模式下的内存分配情况,因为没有深入研究Spark的源代码,所以只能根据日志去看相关的源代码,从而了解“为什么会这样,为什么会那样”。
说明
按照Spark应用程序中的driver分布方式不同,Spark on YARN有两种模式:
yarn-client
模式、
yarn-cluster
模式。
当在YARN上运行Spark作业,每个Spark executor作为一个YARN容器运行。Spark可以使得多个Tasks在同一个容器里面运行。
关于Spark On YARN相关的配置参数,请参考Spark配置参数。本文主要讨论内存分配情况,所以只需要关注以下几个内心相关的参数:
-
:默认值512mspark.driver.memory
-
:默认值512mspark.executor.memory
-
:默认值512mspark.yarn.am.memory
-
:值为spark.yarn.executor.memoryOverhead
executorMemory * 0.07, with minimum of 384
-
:值为spark.yarn.driver.memoryOverhead
driverMemory * 0.07, with minimum of 384
-
:值为spark.yarn.am.memoryOverhead
AM memory * 0.07, with minimum of 384
注意:
-
控制 executor 的堆的大小,但是 JVM 本身也会占用一定的堆空间,比如内部的 String 或者直接 byte buffer,--executor-memory/spark.executor.memory
属性决定向 YARN 请求的每个 executor 或dirver或am 的额外堆内存大小,默认值为spark.yarn.XXX.memoryOverhead
)max(384, 0.07 * spark.executor.memory
- 在 executor 执行的时候配置过大的 memory 经常会导致过长的GC延时,64G是推荐的一个 executor 内存大小的上限。
- HDFS client 在大量并发线程时存在性能问题。大概的估计是每个 executor 中最多5个并行的 task 就可以占满写入带宽。
另外,因为任务是提交到YARN上运行的,所以YARN中有几个关键参数,参考YARN的内存和CPU配置:
-
:AM能够申请的最大内存,默认值为1536MByarn.app.mapreduce.am.resource.mb
-
:nodemanager能够申请的最大内存,默认值为8192MByarn.nodemanager.resource.memory-mb
-
:调度时一个container能够申请的最小资源,默认值为1024MByarn.scheduler.minimum-allocation-mb
-
:调度时一个container能够申请的最大资源,默认值为8192MByarn.scheduler.maximum-allocation-mb