apache-spark - 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 的服务器上。任何帮助表示赞赏。提前致谢。
解决方案
您的服务器/集群有多少个内核?
这个 GC 错误的意思是 spark 已经花费了至少 98% 的运行时垃圾收集(从内存中清理未使用的对象),但在这样做的同时设法释放了 <2% 的内存。正如您所建议的,我认为它是不可避免的,因为它表明内存几乎已满,需要进行垃圾收集。抑制此消息可能会在不久之后导致内存不足错误。这个链接将为您提供有关此错误含义的详细信息。正如您所提到的,解决它就像搞乱配置设置一样简单,但这也可能意味着您需要代码修复。减少存储的临时对象的数量,使您的数据帧尽可能紧凑(例如,将字符串编码为索引),并在正确的时间执行连接或其他操作(最节省内存)都可以提供帮助。研究广播较小的数据帧以进行连接。在没有看到代码的情况下很难提出任何建议。这个资源也是如此。
对于您的 spark 配置调整,此链接应提供您需要的所有信息。乍一看,您的配置设置似乎很高,但我不知道您的集群设置。
推荐阅读
- java - 强制 Maven 使用内部和外部依赖 jar
- c++ - 为什么我的 trie 根指针已被删除并分配为 NULL 时显示一些值?
- java - 如何通过单击 JMenuItem 执行批处理文件以在 Windows 上重新启动服务?
- c++ - 在 C++ 的编译时确定可变参数模板类实例的最大大小
- virtual-machine - 将 tmux 会话迁移到另一台远程机器
- bash - Docker-compose - 使用脚本将环境变量传递给 Flask
- android - 以类似队列的方式使用 RxJava 并暂停/启动队列
- python - 在python中显示文件夹是否包含文件
- java - Java 单一继承
- python - 如何将文本列表格式化为 2 列