理解spark.yarn.executor.memoryOverhead

3
当我在yarn上运行spark应用程序时,使用驱动程序和执行器内存设置--driver-memory 4G --executor-memory 2G,然后运行应用程序时,会抛出异常,指出容器因超过内存限制而被YARN终止。已使用2.5GB的2.5GB物理内存。请考虑提高spark.yarn.executor.memoryOverhead。这里的2.5GB是什么意思?(超额内存、执行器内存或超额+执行器内存?)我之所以问是因为当我将内存设置更改为:--driver-memory 4G --executor-memory 4G --conf --driver-memory 4G --conf spark.yarn.executor.memoryOverhead=2048时,异常就消失了。我想问的是,虽然我已经将超额内存提高到2G,但它仍然低于2.5G,为什么现在可以工作了?

可能是https://dev59.com/j1UL5IYBdhLWcg3wqpk7的重复问题,为什么要增加Spark YARN Executor MemoryOverhead? - Amit Kumar
@AmitKumar 这不是一个重复的问题 - Tom
但它包含了你在这里提出的问题的解释。你可以点击其中的参考Spark链接进一步了解。我认为那个链接中已经很好地解答了你所问的问题。 - Amit Kumar
1个回答

10
让我们了解Spark中内存如何在各个区域之间划分。
1. Executor内存开销: 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)。因此,假设您为每个executor分配了单个核心,那么每个executor将保留384 MB的空间。
2. 执行和存储内存: 默认情况下,spark.memory.fraction = 0.6,这意味着执行和存储作为一个统一的区域占用剩余内存的60%,即998 MB。除非启用spark.memory.useLegacyMode,否则它们之间没有严格的边界。否则,它们共享一个移动的边界。
3. 用户内存: 在分配执行和存储内存后,剩余的内存池,完全由您自己来决定如何使用它。您可以在其中存储自己的数据结构,在RDD转换中使用。例如,您可以通过使用mapPartitions转换并维护哈希表来重新编写Spark聚合以运行此聚合。这占据了MemoryOverhead后剩余40%的内存。在您的情况下,它约为660 MB
如果您的作业没有满足上述任何分配,那么很可能会遇到OOM问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接