Apache 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

当我在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 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的可能重复项它不是重复项,但它解释了您在这里提出的问题。你可以进入里面的参考火花链接。我想这就解释了你的要求。