【发布时间】: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