Apache spark 区别于;火花、纱线、执行器、记忆头”;及;spark.memory.offHeap.size“;

Apache spark 区别于;火花、纱线、执行器、记忆头”;及;spark.memory.offHeap.size“;,apache-spark,yarn,Apache Spark,Yarn,我在纱线上跑步。我不明白以下设置与spark.warn.executor.memoryOverhead和spark.memory.offHeap.size之间有什么区别。两者似乎都是为spark executor分配堆外内存的设置。我应该用哪一个?另外,建议执行器堆外内存的设置是什么 非常感谢 spark.Thread.executor.memoryOverhead用于StaticMemoryManager。这在旧的Spark版本(如1.2)中使用 每个执行器要分配的堆外内存量(兆字节)。这是一

我在纱线上跑步。我不明白以下设置与
spark.warn.executor.memoryOverhead
spark.memory.offHeap.size
之间有什么区别。两者似乎都是为spark executor分配堆外内存的设置。我应该用哪一个?另外,建议执行器堆外内存的设置是什么

非常感谢

  • spark.Thread.executor.memoryOverhead
    用于StaticMemoryManager。这在旧的Spark版本(如1.2)中使用
  • 每个执行器要分配的堆外内存量(兆字节)。这是一种内存,它负责VM开销、内部字符串、其他本机开销等。这往往会随着执行器的大小(通常为6-10%)而增长

    您可以在较旧的Spark文档中找到这一点,如Spark1.2文档:

    https://spark.apache.org/docs/1.2.0/running-on-yarn.html
    

  • spark.memory.offHeap.size
    用于UnifiedMemoryManager,默认情况下在1.6版之后使用
  • 可用于堆外分配的绝对内存量(字节)。此设置对堆内存使用没有影响,因此,如果执行器的总内存消耗必须符合某个硬限制,那么请确保相应地缩小JVM堆大小。当spark.memory.offHeap.enabled=true时,必须将其设置为正值

    您可以在最新的Spark文档中找到这一点,如Spark2.4文档:

    https://spark.apache.org/docs/2.4.4/configuration.html
    

    spark.executor.memoryOverhead
    由类似于纱线的资源管理使用,而
    spark.memory.offHeap.size
    由spark内核(内存管理器)使用。关系因版本而异

    Spark 2.4.5及之前版本:


    spark.executor.memoryOverhead
    应包括
    spark.memory.offHeap.size
    。这意味着,如果您指定了
    offHeap.size
    ,则需要手动将此部分添加到纱线的
    存储器overhead
    。从下面的代码中可以看出,当Thread请求资源时,它对堆外大小一无所知:

    private[yarn] val resource = Resource.newInstance(
        executorMemory + memoryOverhead + pysparkWorkerMemory,
        executorCores)
    
    但是,Spark 3.0中的行为发生了变化:


    spark.executor.memoryOverhead
    不再包括
    spark.memory.offHeap.size
    。当您请求资源时,纱线将为您提供
    offHeap.size
    。从新的角度:

    注意:附加内存包括PySpark executor内存(未配置spark.executor.PySpark.memory时)和运行在同一容器中的其他非执行程序进程使用的内存。运行执行器容器的最大内存大小由spark.executor.memoryOverhead、spark.executor.memory、spark.memory.offHeap.size和spark.executor.pyspark.memory之和决定

    从中还可以看出:

    private[yarn] val resource: Resource = {
        val resource = Resource.newInstance(
          executorMemory + executorOffHeapMemory + memoryOverhead + pysparkWorkerMemory, executorCores)
        ResourceRequestHelper.setResourceRequests(executorResourceRequests, resource)
        logDebug(s"Created resource capability: $resource")
        resource
      }
    
    有关此更改的更多详细信息,请参阅

    对于第二个问题,建议对executor堆外内存进行什么设置?这取决于您的应用程序,您需要进行一些测试。我发现page有助于进一步解释:

    堆外内存是减少GC暂停的好方法,因为它不在GC的作用域内。但是,它会带来序列化和反序列化的开销。后者反过来使堆外数据有时可以放在堆内存中,从而暴露给GC。此外,Project Wonder(字节数组)带来的新数据格式有助于减少GC开销。这两个原因使得在ApacheSpark应用程序中使用堆外内存应该仔细规划,尤其是测试


    顺便说一句,
    spark.warn.executor.memoryOverhead
    已被弃用并更改为
    spark.executor.memoryOverhead
    ,这是纱线和Kubernetes的常见参数。

    您能否详细说明这两个参数之间的差异?