【问题标题】:GC overhead limit exceeded on PySparkPySpark 超过 GC 开销限制
【发布时间】:2017-09-11 21:31:51
【问题描述】:

我目前正在使用 PySpark 处理大量日志,并且在我的集群上遇到了一些内存问题。

它给了我以下错误:

HTTP 错误 500

访问 /jobs/ 时出现问题。原因:

服务器错误原因:

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

这是我目前的配置:

spark.driver.cores  3
spark.driver.memory 6g
spark.executor.cores    3
spark.executor.instances    20
spark.executor.memory   6g
spark.yarn.executor.memoryOverhead  2g

首先,我不会在我的 spark 作业中缓存/保留任何内容。

我读到它可能与memoryOverhead有关,这就是我增加它的原因。但似乎还不够。 我还读到它也可能是垃圾收集器的问题。这是我的主要问题,当您必须处理许多不同的数据库时,最佳实践是什么。

我必须做很多 JOIN,我正在使用 SparkSql 做这件事,并且我正在创建很多 TempViews。这是一个不好的做法吗?发出一些巨大的 SQL 请求并在一个 SQL 请求中执行 10 个连接会更好吗?它会降低代码的可读性,但它可以帮助解决我的问题吗?

谢谢,

【问题讨论】:

  • 你用什么spark版本?您是否能够验证传递给 spark 的驱动程序 JVM 的 -Xmx 参数值?您是否尝试使用 visualvm 连接到驱动程序以检查哪些对象占用了这么多内存?
  • 确保您的 spark.memory.fraction=0.6 。如果它高于您遇到垃圾收集错误,请参阅stackoverflow.com/a/47283211/179014

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


【解决方案1】:

嗯,我想我已经解决了我的问题。这与广播有关。

我认为由于我的加入很大,他们需要相当长的时间,所以我禁用了广播:

config("spark.sql.autoBroadcastJoinThreshold", "-1")

问题似乎解决了。

谢谢,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多