阅读完文档后,我不明白在YARN上运行的Spark是如何考虑Python内存消耗的。
是否计入spark.executor.memory
,spark.executor.memoryOverhead
或其中?
特别是我有一个带有spark.executor.memory=25G
,spark.executor.cores=4
的PySpark应用程序,并且在运行{{1}时遇到超出内存限制的常见容器被YARN杀死。错误在RDD上。它运行在相当大量的复杂Python对象上,因此预计会占用一些非常重要的内存但不会占用25GB。我应该如何配置不同的内存变量以用于繁重的Python代码?
答案 0 :(得分:10)
我尝试将内存增加到spark.python.worker.memory
默认值( 512m ),因为Python代码很重,而且的属性值不计入spark.executor.memory
强>
聚合期间每个python worker进程使用的内存量, 格式与JVM内存字符串相同(例如512m,2g)。 如果 聚合期间使用的内存超过此数量,它将溢出 数据到磁盘。 link
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会杀死占用内存超过其所需内存的进程 executorMemoryOverhead
和executorMemory
的总和。
在工作者使用的给定图像python进程中 那么
spark.python.worker.memory
spark.yarn.executor.memoryOverhead
+spark.executor.memory
是 特定的JVM。