Databricks Spark:java.lang.OutOfMemoryError:超出GC开销限制

5
我正在Databricks集群上执行一个Spark作业。我通过Azure Data Factory管道触发作业,并在15分钟的时间间隔内执行,但在成功执行三到四次后,作业失败并抛出异常"java.lang.OutOfMemoryError: GC overhead limit exceeded"。 虽然有许多关于上述问题的答案,但在大多数情况下,它们的作业都未运行,但在我的情况下,它在之前的一些作业成功执行后失败了。 我的数据大小只有不到20 MB。
我的集群配置是: Databricks cluster Configuration 那么我的问题是应该在服务器配置中做哪些更改。如果问题来自于我的代码,为什么大部分时间都能够成功执行。请给出建议并给我提供解决方案。

谁在点踩就应该说明原因。 - Stark
点赞了但不是踩的人 - thebluephantom
3个回答

0
有时候垃圾回收器无法释放驱动程序内存中加载的所有对象。
您可以尝试强制执行GC来完成此操作。您可以通过执行以下操作来实现:

spark.catalog.clearCache()
for (id, rdd) in spark.sparkContext._jsc.getPersistentRDDs().items():
    rdd.unpersist()
    print("Unpersisted {} rdd".format(id))

0

您可以尝试增加驱动节点的内存。


需要更多的解释来说明如何做到这一点。 - Jean-François Fabre
在集群配置页面中增加驱动节点的计算能力。例如,上面的快照显示了8个内核和16GB的内存 - 尝试选择具有更高内存的不同配置并查看结果。 - Vivek Atal

0

这很可能与执行器内存过低有关。不确定当前设置是什么,如果是默认值,在这个特定的Databricks分发中默认值是多少。尽管它通过了,但由于内存不足会发生很多GC,因此偶尔会失败。在Spark配置下,请提供spark.executor.memory以及与执行器数量和每个执行器的核心数相关的其他参数。在spark-submit中,配置将被提供为spark-submit --conf spark.executor.memory=1g


嘿@Shridhar,我正在寻找确切的解决方案,而不是通用答案。 - Stark
解决方案是将spark.executor.memory设置为1g,但很抱歉我不确定如何从您启动应用程序的方式中进行设置。可能您可以在高级选项下提供的Spark配置部分中添加。 - Shridhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接