gpt4 book ai didi

apache-spark - Spark off堆内存通过缓存扩展

转载 作者:行者123 更新时间:2023-12-05 03:44:17 33 4
gpt4 key购买 nike

我正在努力让我的 Spark 程序避免超过 YARN 内存限制(在执行程序上)。
我得到的“已知”错误是:

Container killed by YARN for exceeding memory limits.  3.8 GB of 3.6 GB physical memory used.

我不想仅仅增加执行程序内存、执行程序内存开销或调整我的资源或分区,我想知道为什么我的堆外内存正在扩展。

我正在使用 pyspark v2.4.4,据我所知,YARN 内存开销(对于执行程序)是我的 Spark 程序(在 JVM 之外)分配的任何堆外内存。

我所知道的唯一额外的“不相关”堆外内存是 Python 内存,它不是 Spark 内存开销的一部分 documentation :

The maximum memory size of container to running executor is determinedby the sum of spark.executor.memoryOverhead, spark.executor.memory,spark.memory.offHeap.size and spark.executor.pyspark.memory.

我在我的程序中使用大量缓存;禁用 persist 调用以某种方式解决了内存开销问题(更少的执行程序死亡,程序最终可以完成),但是由于此数据应该仅在 JVM/磁盘内部针对执行内存进行管理 UnifiedMemoryManager ,它不应使用任何堆外内存。

由于堆外模式默认是关闭的(spark.memory.offHeap.use),哪些场景可能会导致内存开销扩大,为什么在我的程序中关闭缓存有助于减少开销大小?

编辑
使用更大的执行器(双倍内存和内核)也可以解决这个问题。
JVM 上更大的内存意味着更大的开销(大于 386m 时为 10%)是有道理的,但我们仍然在此 JVM 上使用 2 个内核(即 2 个任务),我不明白内存开销在哪些情况下会扩展。

最佳答案

Spark 可能会在随机播放和缓存 block 传输期间使用堆外内存;即使 spark.memory.offHeap.use=false

Spark Summit 2016 中也提到了这个问题(4:05 分钟)

Spark 3.0.0及以上版本

自 Spark 3.0.0 起,可以使用 spark.network.io.preferDirectBufs=false 禁用此行为。

Spark configuration对此进行了简短的解释:

If enabled then off-heap buffer allocations are preferred by theshared allocators. Off-heap buffers are used to reduce garbagecollection during shuffle and cache block transfer. For environmentswhere off-heap memory is tightly limited, users may wish to turn thisoff to force all allocations to be on-heap.

星火<3.0.0

对于低于 3.0.0 的版本,使用更大的执行器和更高的内存开销可以显着解决这个问题,同时保持每个执行器分配的内存相同以及 Spark 作业的总体资源消耗相同。
例如:

之前:

spark.executor.cores=1
spark.executor.memory=2g

容器总内存:2g + 384m(最小开销)= 2.375g
每个内核的执行程序内存:2.375g
每个内核的 JVM 内存:2g

之后:

spark.executor.cores=4
spark.executor.memory=6g
spark.executor.memoryOverhead=3g

容器总内存:6g + 3g = 9g
每个内核的执行程序内存:2.25g
每个内核的 JVM 内存:1.5g

如果您的容器被 YARN 杀死(就像在这个 Q 中),有目的的更改应该会有所帮助,但请注意,这是与其他事物的权衡:
每个核心的整体 JVM 内存较低,因此您更容易遇到用户内存(主要是您在执行程序中创建的对象)和 Spark 内存(执行内存和存储内存)中的内存瓶颈。
超出的 Spark 内存通常会溢出到磁盘(具有额外的不相关的复杂性),因此牺牲性能和用户内存不足可能会导致执行程序出现 OutOfMemory 错误,所以要小心。

关于apache-spark - Spark off堆内存通过缓存扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66530938/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com