首页 > 解决方案 > 了解 spark.yarn.executor.memoryOverhead

问题描述

当我在纱线上运行火花应用程序时,驱动程序和执行程序内存设置为--driver-memory 4G --executor-memory 2G

然后当我运行应用程序时,会抛出一个异常,抱怨Container killed by YARN for exceeding memory limits. 2.5 GB of 2.5 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead.

这个 2.5 GB 在这里意味着什么?(开销内存,执行程序内存或开销+执行程序内存?)我这样问是因为当我将内存设置更改为:

--driver-memory 4G --executor-memory 4G --conf --driver-memory 4G --conf spark.yarn.executor.memoryOverhead=2048,然后异常消失。

我想问,虽然我把开销内存提升到了2G,但还是在2.5G以下,为什么现在还能用?

标签: apache-spark

解决方案


让我们了解一下 Spark 中内存是如何在各个区域之间分配的。

  1. 执行器内存开销:

spark.yarn.executor.memoryOverhead = max(384 MB, .07 * spark.executor.memory). 在您的第一种情况下,假设您为每个执行器分配了单个核心,memoryOverhead = max(384 MB, 0.07 * 2 GB) = max(384 MB, 143.36 MB)因此memoryOverhead = 384 MB在每个执行器中保留。

  1. 执行和存储内存:

默认情况下spark.memory.fraction = 0.6,这意味着执行和存储作为一个统一区域占用剩余内存的 60%,即998 MB. 除非您启用,否则不会为每个区域分配严格的边界spark.memory.useLegacyMode。否则,它们共享一个移动边界。

  1. 用户内存:

分配执行和存储内存后剩余的内存池,完全取决于您以您喜欢的方式使用它。您可以在那里存储您自己的数据结构,这些数据结构将用于 RDD 转换。例如,您可以通过使用 mapPartitions 转换维护哈希表来重写 Spark 聚合以运行此聚合。这包括 MemoryOverhead 之后剩余的 40% 内存。在您的情况下,它是~660 MB.

如果您的工作没有满足上述任何分配,那么很有可能最终会出现 OOM 问题。


推荐阅读