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

时间:2018-08-29 05:13:56

标签: apache-spark pyspark apache-spark-sql

我是PySpark的新手。我一直试图缓存30GB的数据,因为我需要对其进行集群。因此,执行诸如shipperCustomer之类的任何操作  最初我得到一些id。因此,我在Google上进行了搜索,发现增加执行程序/驱动程序的内存将为我做到这一点。所以,这是我当前的配置

customers

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我有同样的错误。在转换为 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()