繁体   English   中英

了解spark.yarn.executor.memoryOverhead

[英]Understanding spark.yarn.executor.memoryOverhead

当我在yarn上运行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. 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. 执行程序MemoryOverhead:

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问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM