“spark.yarn.executor.memoryOverhead”和“spark.memory.offHeap.size”之间的区别

Abd*_*man 4 hadoop-yarn apache-spark

我在纱线上运行火花。我不明白以下设置spark.yarn.executor.memoryOverheadspark.memory.offHeap.size. 两者似乎都是分配堆外内存以触发执行程序的设置。我应该使用哪一种?另外,执行程序堆外内存的推荐设置是什么?

非常感谢!

Cai*_*hen 9

spark.executor.memoryOverhead由 YARN 等资源管理使用,而spark.memory.offHeap.size由 Spark 核心(内存管理器)使用。关系因版本而有所不同。

Spark 2.4.5 及之前版本:

spark.executor.memoryOverhead应该包括spark.memory.offHeap.size. 这意味着如果指定offHeap.size,则需要手动将此部分添加到memoryOverheadYARN。正如您从YarnAllocator.scala下面的代码中看到的,当 YARN 请求资源时,它对以下内容一无所知offHeap.size

private[yarn] val resource = Resource.newInstance(
    executorMemory + memoryOverhead + pysparkWorkerMemory,
    executorCores)
Run Code Online (Sandbox Code Playgroud)

但是,行为在 Spark 3.0 中发生了变化:

spark.executor.memoryOverhead不再包括spark.memory.offHeap.size。YARN 将offHeap.size在您请求资源时包含在内。从新文档

注意:额外的内存包括 PySpark 执行器内存(当 spark.executor.pyspark.memory 未配置时)和运行在同一容器中的其他非执行器进程使用的内存。运行 executor 的容器最大内存大小由 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
  }
Run Code Online (Sandbox Code Playgroud)

有关此更改的更多详细信息,您可以参考此 Pull Request

对于您的第二个问题,执行器堆外内存的推荐设置是什么?这取决于您的应用程序,您需要进行一些测试。我发现这个页面有助于进一步解释它:

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

顺便说一句,spark.yarn.executor.memoryOverhead已弃用并更改为spark.executor.memoryOverhead,这在 YARN 和 Kubernetes 中很常见。


Smo*_*riu 0

  1. spark.yarn.executor.memoryOverhead用于StaticMemoryManager。这在较旧的 Spark 版本(如 1.2)中使用。

要为每个执行器分配的堆外内存量(以兆字节为单位)。这是计算 VM 开销、内部字符串、其他本机开销等内容的内存。它往往会随着执行器大小而增长(通常为 6-10%)。

您可以在较旧的 Spark 文档中找到此内容,例如 Spark1.2 文档:

https://spark.apache.org/docs/1.2.0/running-on-yarn.html
Run Code Online (Sandbox Code Playgroud)
  1. 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
Run Code Online (Sandbox Code Playgroud)