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

Posted

技术标签:

【中文标题】Pyspark:java.lang.OutOfMemoryError:超出 GC 开销限制【英文标题】:Pyspark: java.lang.OutOfMemoryError: GC overhead limit exceeded 【发布时间】:2018-08-29 05:13:55 【问题描述】:

我对 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 的服务器。任何帮助表示赞赏。提前致谢。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

感谢您的帮助! :) 我有 48 个核心。啊..是的,也许你是对的,我的数据清理逻辑没有优化。我会调查的。但这是另一个引发相同错误的问题。假设我想加载一个 30GB 的数据,使用 vectorAssembler 创建 featureCols 并对其执行 k-means。超出了 GC 开销限制。你的方法是什么? 你能找出是哪一行导致了内存错误,并将相关代码(错误前的10-20)放在原帖中吗?你可以通过移动你的 return 语句并查看它停止工作的位置来找出哪一行。【参考方案2】:

我有同样的错误。在转换为 Pandas 之前,我减小了 spark 数据框的大小。我还添加了 pyarrow 来触发配置设置。

我从以下开始: conda install -c conda-forge pyarrow -y

将此添加到代码中: .config("spark.sql.execution.arrow.enabled","true")\

并按如下方式分手(我认为是可选的):

    df=spark.sql(f"""select * from hdfs_db.hdfs_tbl""")
    ## === Select a few columns
    df = df.select(['sbsb_id', 'rcvd_dt', 'inq_tracking_id', 'comments'])
    ## === Convert to Pandas
    df = df.toPandas()

【讨论】:

以上是关于Pyspark:java.lang.OutOfMemoryError:超出 GC 开销限制的主要内容,如果未能解决你的问题,请参考以下文章

pyspark.sql.functions.col 和 pyspark.sql.functions.lit 之间的 PySpark 区别

Pyspark 安装错误:没有名为“pyspark”的模块

Pyspark:将 sql 查询转换为 pyspark?

Pyspark - ImportError:无法从“pyspark”导入名称“SparkContext”

Pyspark:基于所有列减去/差异 pyspark 数据帧

在 PySpark 的两个不同 pyspark.sql.dataframes 中的两列中创建一个 pyspark.sql.dataframe