YARN 上的 Spark 运行 如何计算 Python 内存使用量?

How does Spark running on YARN account for Python memory usage?

阅读文档后,我不明白 YARN 上的 Spark 运行 是如何计算 Python 内存消耗的。

是否计入 spark.executor.memoryspark.executor.memoryOverhead 或哪里?

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

我会尝试将内存增加到 spark.python.worker.memory 默认值 (512m),因为 Python 代码和这个 属性 值 不计入spark.executor.memory.

Amount of memory to use per python worker process during aggregation, in the same format as JVM memory strings (e.g. 512m, 2g). If the memory used during aggregation goes above this amount, it will spill the data into disks. link

Spark 中的 ExecutorMemoryOverhead 计算:

MEMORY_OVERHEAD_FRACTION = 0.10 
MEMORY_OVERHEAD_MINIMUM = 384 
val executorMemoryOverhead = 
  max(MEMORY_OVERHEAD_FRACTION * ${spark.executor.memory}, MEMORY_OVERHEAD_MINIMUM))

对于 YARN 和 Mesos,属性 是 spark.{yarn|mesos}.executor.memoryOverhead

YARN 会终止占用内存超过请求的进程,即 executorMemoryOverheadexecutorMemory.

的总和

In given image python processes in worker uses spark.python.worker.memory, then spark.yarn.executor.memoryOverhead + spark.executor.memory is specific JVM.

Image credits

额外资源Apache mailing thread