Pyspark:java.lang.OutOfMemoryError: GC超时限制已超过

6

我对PySpark相对较新。因为需要在其上执行聚类,所以我一直在尝试缓存30GB的数据。但是在执行像count这样的操作时,我最初遇到了一些堆空间问题。于是我搜索了一下并发现增加执行程序/驱动器内存可以解决这个问题。因此,以下是我的当前配置:

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

但现在我遇到了垃圾收集问题。我查看了stackoverflow,但是答案都非常模糊。人们建议调整配置。有没有更好的方法来确定应该配置什么?我知道这只是一个调试异常,我可以关闭它。但我仍然想学习一些数学知识,以便自己计算配置。

我目前在拥有256GB RAM的服务器上。感谢您的帮助。提前致谢。

2个回答

3

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

这个GC错误所表达的意思是,Spark花费了至少98%的运行时间进行垃圾回收(清理未使用的内存对象),但在此过程中只成功释放了<2%的内存。我认为这是不可避免的,因为它表明内存几乎已满,需要进行垃圾回收。抑制此消息可能会导致稍后出现内存不足错误。 此链接将为您提供有关此错误的详细信息。解决它可能只需要简单地调整配置设置,就像您提到的那样,但也可能意味着您需要代码修复。减少存储临时对象的数量,使您的数据框架尽可能紧凑(例如将字符串编码为索引),并在正确的时间执行连接或其他操作(最节省内存)都可以帮助解决此问题。请考虑广播较小的数据框架以进行连接。没有看到代码很难建议任何东西,这个资源也是如此。

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


1
谢谢你的帮助! :) 我有48个核心。啊..是的,也许你是对的,我的数据清理逻辑没有优化。我会研究一下的。但这里又出现了一个问题,抛出了相同的错误。假设我想加载一个30GB大小的数据,使用vectorAssembler创建featureCols并对其执行k-means。出现了GC超限错误。你会采取什么方法? - lu5er
你能找出导致内存错误的代码行,并将相关代码(在错误之前的10-20行)放在原始帖子中吗?你可以通过移动返回语句并查看停止工作的位置来找出哪一行是问题所在。 - Keshinko

0
我遇到了同样的错误。在将Spark DataFrame转换为Pandas之前,我减小了其大小。我还将pyarrow添加到了Spark配置设置中。
我开始使用: 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()

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