首页 > 解决方案 > Pyspark:java.lang.OutOfMemoryError:超出 GC 开销限制

问题描述

我对 PySpark 比较陌生。我一直在尝试缓存 30GB 的数据,因为我需要对其进行聚类。因此,执行任何操作,就像count 最初我得到一些heap space issue. 所以我用谷歌搜索,发现增加执行器/驱动程序的内存对我来说是可行的。所以,这是我目前的配置

SparkConf().set('spark.executor.memory', '45G')
.set('spark.driver.memory', '80G')
.set('spark.driver.maxResultSize', '10G')

但现在我得到了这个garbage collection issue。我检查了 SO,但到处的答案都很模糊。人们建议使用配置。有没有更好的方法来确定配置应该是什么?我知道这只是一个调试异常,我可以将其关闭。但是我仍然想学习一些数学来自己计算配置。

我目前在具有 256GB RAM 的服务器上。任何帮助表示赞赏。提前致谢。

标签: apache-sparkpysparkapache-spark-sql

解决方案


您的服务器/集群有多少个内核?

这个 GC 错误的意思是 spark 已经花费了至少 98% 的运行时垃圾收集(从内存中清理未使用的对象),但在这样做的同时设法释放了 <2% 的内存。正如您所建议的,我认为它是不可避免的,因为它表明内存几乎已满,需要进行垃圾收集。抑制此消息可能会在不久之后导致内存不足错误。这个链接将为您提供有关此错误含义的详细信息。正如您所提到的,解决它就像搞乱配置设置一样简单,但这也可能意味着您需要代码修复。减少存储的临时对象的数量,使您的数据帧尽可能紧凑(例如,将字符串编码为索引),并在正确的时间执行连接或其他操作(最节省内存)都可以提供帮助。研究广播较小的数据帧以进行连接。在没有看到代码的情况下很难提出任何建议。这个资源也是如此。

对于您的 spark 配置调整,此链接应提供您需要的所有信息。乍一看,您的配置设置似乎很高,但我不知道您的集群设置。


推荐阅读