我在纱线上生出火花。我不了解以下设置spark.yarn.executor.memoryOverhead
和spark.memory.offHeap.size
有什么区别。两者似乎都是用于分配堆外内存以激发执行程序的设置。我应该使用哪一个?另外,对于执行程序堆内存的建议设置是什么?
非常感谢!
答案 0 :(得分:4)
spark.executor.memoryOverhead
由YARN之类的资源管理使用,而spark.memory.offHeap.size
由Spark核心(内存管理器)使用。关系因版本而有所不同。
Spark 2.4.5及更低版本:
spark.executor.memoryOverhead
应该包含spark.memory.offHeap.size
。这意味着,如果指定offHeap.size
,则需要为YARN手动将此部分添加到memoryOverhead
中。从YarnAllocator.scala的以下代码中可以看到,当YARN请求资源时,它对offHeap.size
一无所知:
private[yarn] val resource = Resource.newInstance(
executorMemory + memoryOverhead + pysparkWorkerMemory,
executorCores)
但是,该行为在Spark 3.0中已更改:
spark.executor.memoryOverhead
不再包含spark.memory.offHeap.size
。请求资源时,YARN将为您提供offHeap.size
。来自新的documentation:
注意:额外的内存包括PySpark执行程序内存(未配置spark.executor.pyspark.memory时)和在同一容器中运行的其他非执行程序进程使用的内存。容器对正在运行的执行程序的最大内存大小由spark.executor.memoryOverhead,spark.executor.memory,spark.memory.offHeap.size和spark.executor.pyspark.memory的总和决定。
从code您还可以告诉:
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
}
有关此更改的更多详细信息,请参阅this Pull Request。
对于您的第二个问题,建议的执行者内存不足的设置是什么?这取决于您的应用程序,您需要进行一些测试。我发现this页对进一步解释很有帮助:
堆外内存是减少GC暂停的好方法,因为它不在GC的范围内。但是,它带来了序列化和反序列化的开销。后者又使得堆外数据有时可以放到堆内存中,从而暴露给GC。此外,钨计划带来的新数据格式(字节数组)有助于减少GC开销。这两个原因使得在Apache Spark应用程序中使用堆外内存应该经过仔细计划,尤其是要进行测试。
BTW,spark.yarn.executor.memoryOverhead
已过时,已更改为spark.executor.memoryOverhead
,这在YARN和Kubernetes中很常见。
答案 1 :(得分:0)
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
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