Spark 在扩展时经常会出现内存不足错误。在这些情况下,程序员应该进行微调。或者重新检查您的代码,以确保您没有做任何过多的事情,例如收集所有bigdata在驱动程序中,这很可能超过内存开销限制,无论你设置多大。
要了解正在发生的事情,您应该意识到何时yarn决定杀死超出内存限制的容器。当容器超出限制时就会发生这种情况内存开销 limit.
在调度程序中,您可以检查事件时间线以查看容器发生了什么。如果 Yarn 杀死了一个容器,它将显示为红色,当您将鼠标悬停/单击它时,您将看到如下消息:
容器因超出内存限制而被 YARN 终止。已使用 16 GB 物理内存中的 16.9 GB。考虑提高spark.yarn.executor.memoryOverhead。
![enter image description here](https://i.stack.imgur.com/9IMbu.png)
因此,在这种情况下,您要关注的是这些配置属性(值是示例my簇):
# More executor memory overhead
spark.yarn.executor.memoryOverhead 4096
# More driver memory overhead
spark.yarn.driver.memoryOverhead 8192
# Max on my nodes
#spark.executor.cores 8
#spark.executor.memory 12G
# For the executors
spark.executor.cores 6
spark.executor.memory 8G
# For the driver
spark.driver.cores 6
spark.driver.memory 8G
首先要做的就是增加memoryOverhead
.
在驱动程序中还是在执行程序中?
当您从 UI 概览集群时,您可以单击尝试 ID 并检查诊断信息其中应该提到被杀死的容器的 ID。如果和你的一样增材制造集装箱,那么它是驱动程序,否则是执行程序。
这并没有解决问题,现在怎么办?
您必须微调所提供的核心数量和堆内存。你看pyspark将在堆外内存中完成大部分工作,因此您不想为堆提供太多空间,因为这会被浪费。你不想给予太少,因为垃圾收集器会出现问题。回想一下,这些是 JVM。
如上所述here,一个工作线程可以托管多个执行程序,因此使用的核心数量会影响每个执行程序拥有的内存量,因此减少 #cores 可能会有所帮助。
我把它写在Spark中的内存开销问题和火花——容器以非零退出代码 143 退出更详细的是,大部分我不会忘记!我还没有尝试过的另一种选择是Spark.默认并行度 or/and spark.storage.memoryFraction
,根据我的经验,这没有帮助。
您可以按照 sds 提到的方式传递配置标志,或者像这样:
spark-submit --properties-file my_properties
其中“my_properties”类似于我上面列出的属性。
对于非数值,您可以这样做:
spark-submit --conf spark.executor.memory='4G'