了解spark.yarn.executor.memoryOverhead

2024-03-26

当我在纱线上运行 Spark 应用程序时,驱动程序和执行程序内存设置为--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,为什么现在还能用呢?


让我们了解一下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) Hence, memoryOverhead = 384 MB假设您为每个执行器分配了单个核心,则在每个执行器中保留。

  1. 执行和存储内存:

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

  1. 用户内存:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解spark.yarn.executor.memoryOverhead 的相关文章

随机推荐