我正在纱线上撒尿。我不明白以下设置spark.yarn.executor.memoryOverhead
和spark.memory.offHeap.size
之间有什么区别。两者似乎都是将堆外内存分配给火花执行器的设置。我应该用哪一种?此外,建议为executor for内存设置什么?
非常感谢!
发布于 2020-05-11 06:22:11
TL;DR:星火1.x和2.x的,星火3.x的spark.offHeap.size= spark.executor.memoryOverhead
(包含在其中),spark.offHeap.size= spark.executor.memoryOverhead
+ spark.offHeap.size
(此页的信用)
详细说明:
spark.executor.memoryOverhead
用于资源管理,如纱线,而spark.memory.offHeap.size
则由Spark (内存管理器)使用。根据版本的不同,这种关系有点不同。
Spark2.4.5及以前:
spark.executor.memoryOverhead
应该包括spark.memory.offHeap.size
。这意味着,如果指定offHeap.size
,则需要手动将此部分添加到纱线的memoryOverhead
中。从下面的YarnAllocator.scala代码中可以看到,当纱线请求资源时,它不知道任何关于offHeap.size
的信息。
private[yarn] val resource = Resource.newInstance(
executorMemory + memoryOverhead + pysparkWorkerMemory,
executorCores)
然而,在Spark3.0:中更改了行为
spark.executor.memoryOverhead
不再包括spark.memory.offHeap.size
。当您请求资源时,纱线将包括offHeap.size
。来自新的文档
注意:其他内存包括PySpark执行器内存(未配置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设置堆内存吗?这取决于您的应用程序,您需要一些测试。我发现这页面有助于进一步解释它:
堆外内存是减少GC暂停的一种很好的方法,因为它不在GC的范围内。然而,它带来了序列化和反序列化的开销。后者则使离堆数据有时可以放到堆内存中,从而暴露在GC中。此外,Project (字节数组)带来的新数据格式有助于减少GC开销。这两个原因使得在Apache应用程序中使用弃堆内存的问题应该得到仔细的规划,特别是测试。
顺便说一句,spark.yarn.executor.memoryOverhead
是不推荐的,改为spark.executor.memoryOverhead
,这是常见的纱线和库伯奈特。
发布于 2020-02-15 06:50:33
spark.yarn.executor.memoryOverhead
用于StaticMemoryManager。这是使用在较早的火花版本,如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时,必须将其设置为正值。
您可以在lates Spark文档中找到这种情况,比如Spark2.4文档:
https://spark.apache.org/docs/2.4.4/configuration.html
https://stackoverflow.com/questions/58666517
复制相似问题