Apache spark 理解火花、纱线、执行器、记忆
当我在Thread上运行spark应用程序时,驱动程序和执行器内存设置为Apache spark 理解火花、纱线、执行器、记忆,apache-spark,Apache Spark,当我在Thread上运行spark应用程序时,驱动程序和执行器内存设置为--驱动程序内存4G--执行器内存2G 然后,当我运行应用程序时,一个异常抛出,抱怨容器因超出内存限制而被纱线杀死。使用2.5 GB的2.5 GB物理内存。考虑升压火花。纱线。执行器。内存开销。< /代码> < /P> 这2.5 GB意味着什么?(开销内存、执行器内存或开销+执行器内存?) --driver memory 4G--executor memory 4G--conf--driver memory 4G--conf
--驱动程序内存4G--执行器内存2G
然后,当我运行应用程序时,一个异常抛出,抱怨容器因超出内存限制而被纱线杀死。使用2.5 GB的2.5 GB物理内存。考虑升压火花。纱线。执行器。内存开销。< /代码> < /P>
这2.5 GB意味着什么?(开销内存、执行器内存或开销+执行器内存?)
--driver memory 4G--executor memory 4G--conf--driver memory 4G--conf spark.warn.executor.memoryOverhead=2048
,然后异常消失
我会问,虽然我已经将开销内存提高到2G,但它仍然低于2.5G,为什么它现在可以工作?让我们了解一下spark中不同区域的内存分配情况
执行人备忘录概述:
spark.warn.executor.memoryOverhead=max(384 MB,.07*spark.executor.memory)
。
在第一种情况下,memoryOverhead=max(384mb,0.07*2gb)=max(384mb,143.36mb)
因此,memoryOverhead=384mb
在每个执行器中保留,假设您为每个执行器分配了单个内核
执行和存储内存:
默认情况下,spark.memory.fraction=0.6
,这意味着作为一个统一区域的执行和存储占用剩余内存的60%,即998 MB
。除非启用spark.memory.useLegacyMode
,否则不会为每个区域分配严格的边界。否则,它们共享一个移动边界
用户内存:
分配执行和存储内存后仍保留的内存池,完全取决于您以自己喜欢的方式使用它。您可以在那里存储自己的数据结构,这些数据结构将用于RDD转换。例如,您可以通过使用mapPartitions转换来重写Spark聚合,并维护哈希表以运行此聚合。这包括MemoryOverhead之后剩余的40%内存。在您的情况下,它是~660MB
如果您的工作无法满足上述任何分配,那么很可能最终导致OOM问题 @AmitKumar的可能重复项它不是重复项,但它解释了您在这里提出的问题。你可以进入里面的参考火花链接。我想这就解释了你的要求。