当我在纱线上运行 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中内存是如何在各个区域之间划分的。
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
则在每个执行程序中保留。
默认情况下spark.memory.fraction = 0.6
,这意味着作为统一区域的执行和存储占用剩余内存的 60%,即998 MB
. 除非您启用spark.memory.useLegacyMode
. 否则,它们共享一个移动边界。
分配执行和存储内存后剩余的内存池,完全取决于您以自己喜欢的方式使用它。您可以在那里存储您自己的数据结构,这些数据结构将用于 RDD 转换。例如,您可以通过使用 mapPartitions 转换维护哈希表来重写 Spark 聚合以运行此聚合。这包括在 MemoryOverhead 之后剩余的 40% 内存。在你的情况下是~660 MB
。
如果您的工作没有满足上述任何分配,那么很可能最终会出现 OOM 问题。
归档时间: |
|
查看次数: |
7486 次 |
最近记录: |