Scala和Spark中的OutOfMemoryError

时间:2015-07-07 18:05:31

标签: scala apache-spark

我使用此代码从文本文件中提取bigrams:

 java.lang.OutOfMemoryError: GC overhead limit exceeded

at org.spark-project.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue.java:342)
at org.spark-project.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:526)
at org.spark-project.jetty.util.thread.QueuedThreadPool.access$600(QueuedThreadPool.java:44)
at org.spark-project.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)

我的输入文件是45 MB, 当我运行此代码时,它显示以下错误: (我认为它与Collect())

有关
Qt.application.arguments

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可能实际上没有通过SparkConf获取要求的1g内存。原因是当master = local时,Spark驱动程序和执行程序将完全在运行此处所示代码的JVM内运行,从而创建SparkContext。到那时,获取比JVM启动时分配的Java堆还为时已晚。您需要将-Xmx1G arg添加到IntelliJ用于启动运行代码的JVM的命令中。

您没有确切地说明如何在IntelliJ中运行代码。但您需要做的是创建或修改“运行配置”。

在IntelliJ UI中的“运行”工具栏菜单下,选择“编辑配置...”命令。这将打开一个如下所示的窗口。这显示我的运行配置在“Scala控制台”中运行。 “VM选项:”框是您需要包含-Xmx1G jvm arg的位置。就我而言,我正在使用2.5G的内存。

当您以前运行应用程序时,IntelliJ可能已经为您创建了运行配置。如果没有,请使用此窗口创建一个正确类型的新窗口,例如“Scala控制台”。

要检查正在运行的Scala应用程序中的内存,请使用以下命令检查实际的当前,最大和空闲的jvm内存,以查看您是否确实获得了所请求的内存。

  • sys.runtime.totalMemory()
  • sys.runtime.maxMemory()
  • sys.runtime.freeMemory()

enter image description here

答案 1 :(得分:0)

当您提交申请时,请尝试通过设置参数来增加spark.driver.memory(默认为512mb):

--driver-memory 4g

查看spark文档以获取有关此类参数的更多信息:https://spark.apache.org/docs/latest/configuration.html