Abd*_*man 4 hadoop-yarn apache-spark
我在纱线上运行火花。我不明白以下设置spark.yarn.executor.memoryOverhead和spark.memory.offHeap.size. 两者似乎都是分配堆外内存以触发执行程序的设置。我应该使用哪一种?另外,执行程序堆外内存的推荐设置是什么?
非常感谢!
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 中很常见。
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)
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)
| 归档时间: |
|
| 查看次数: |
1646 次 |
| 最近记录: |