在YARN上运行的Spark如何解释Python内存使用情况?

dom*_*kck 21 python hadoop hadoop-yarn apache-spark pyspark

阅读完文档之后,我不明白在YARN上运行的Spark是如何考虑Python内存消耗的.

是否计入spark.executor.memory,spark.executor.memoryOverhead还是在哪里?

特别是我有一个PySpark应用程序spark.executor.memory=25G,spark.executor.cores=4我遇到YARN因超出内存限制而被杀死的频繁容器.map在RDD上运行时出错.它运行在相当大量的复杂Python对象上,因此预计会占用一些非常重要的内存但不会占用25GB.我应该如何配置不同的内存变量以用于繁重的Python代码?

mrs*_*vas 11

我尝试将内存增加到spark.python.worker.memory默认值(512m),因为Python代码很重,并且此属性值不计入spark.executor.memory.

聚合期间每个python worker进程使用的内存量,格式与JVM内存字符串相同(例如512m,2g).如果聚合期间使用的内存超过此数量,则会将数据溢出到磁盘中.链接

Spark中的ExecutorMemoryOverhead计算:

MEMORY_OVERHEAD_FRACTION = 0.10 
MEMORY_OVERHEAD_MINIMUM = 384 
val executorMemoryOverhead = 
  max(MEMORY_OVERHEAD_FRACTION * ${spark.executor.memory}, MEMORY_OVERHEAD_MINIMUM))
Run Code Online (Sandbox Code Playgroud)

该物业是spark.{yarn|mesos}.executor.memoryOverhead为YARN和Mesos.

YARN杀死比他们要求的是这些都占用更多的内存的过程的总和 executorMemoryOverhead及executorMemory.

在worker使用的给定图像python进程中 spark.python.worker.memory, spark.yarn.executor.memoryOverhead+ spark.executor.memory是特定的JVM.

PySpark Internals 图片学分

其他资源Apache邮件线程

  • 答案似乎还是有点不清楚。如果没有将 `spark.python.worker.memory` 考虑在内(即`spark.executor.memory` 的子集),那么它是否是 `spark.yarn.executor.memoryOverhead` 的一部分?`spark.python.worker.memory` 显然是堆外的,如果 `spark.executor.memory` + `spark.yarn.executor.memoryOverhead` > `yarn.nodemanager.resource.memory-mb`,YARN 会杀死一个容器。这似乎表明应该在 `spark.yarn.executor.memoryOverhead` 中考虑 `spark.python.worker.memory`。你可否确认? (3认同)
  • @mr-srinivas `spark.python.worker.memory` 谈论*聚合*期间使用的内存。如果不聚合任何东西,例如在一个简单的地图阶段呢? (2认同)