【发布时间】:2014-02-04 00:00:38
【问题描述】:
我的集群:1个master,11个slave,每个节点有6GB内存。
我的设置:
spark.executor.memory=4g, Dspark.akka.frameSize=512
问题出在这里:
首先,我从 HDFS 读取一些数据(2.19 GB)到 RDD:
val imageBundleRDD = sc.newAPIHadoopFile(...)
第二,在这个RDD上做点什么:
val res = imageBundleRDD.map(data => {
val desPoints = threeDReconstruction(data._2, bg)
(data._1, desPoints)
})
最后,输出到HDFS:
res.saveAsNewAPIHadoopFile(...)
当我运行我的程序时,它显示:
.....
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:24 as TID 33 on executor 9: Salve7.Hadoop (NODE_LOCAL)
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:24 as 30618515 bytes in 210 ms
14/01/15 21:42:27 INFO cluster.ClusterTaskSetManager: Starting task 1.0:36 as TID 34 on executor 2: Salve11.Hadoop (NODE_LOCAL)
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Serialized task 1.0:36 as 30618515 bytes in 449 ms
14/01/15 21:42:28 INFO cluster.ClusterTaskSetManager: Starting task 1.0:32 as TID 35 on executor 7: Salve4.Hadoop (NODE_LOCAL)
Uncaught error from thread [spark-akka.actor.default-dispatcher-3] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled for ActorSystem[spark]
java.lang.OutOfMemoryError: Java heap space
任务太多了?
PS:输入数据约为 225 MB 时一切正常。
我该如何解决这个问题?
【问题讨论】:
-
如何运行spark?它来自控制台吗?或者您使用哪些部署脚本?
-
我使用 sbt 编译和运行我的应用程序。 sbt 包然后 sbt 运行。一个月前我在hadoop上实现了同样的程序,遇到了同样的OutOfMemoryError问题,但是在hadoop中可以通过将mapred.child.java.opts的值从Xmx200m增加到Xmx400m来轻松解决。 spark是否对其任务有任何jvm设置?我想知道spark.executor.memory是否与hadoop中的mapred.child.java.opts含义相同。在我的程序中 spark.executor.memory 已经设置为 4g,比 hadoop 中的 Xmx400m 大得多。谢谢~
-
你提到的三个步骤是你唯一做的吗?由 (data._1, desPoints) 生成的数据的大小是多少 - 这应该适合内存,尤其是如果这些数据被洗牌到另一个阶段
-
驱动的内存配置是什么?检查哪个服务器出现内存不足错误。是司机还是执行人之一。
-
在这里查看所有配置属性:spark.apache.org/docs/2.1.0/configuration.html
标签: out-of-memory apache-spark