2015-09-07 49 views
2

我在火花流应用程序中的驱动程序进程有问题。问题是驱动程序进程内存不足。主节点和工作节点都没有问题(它们都运行良好,连续数天)。但即使使用非常有限的馈送(每5分钟发送两条消息,处理1条消息的时间少于100毫秒),我会在一段时间后(例如,周末)在驱动程序过程中发生oom错误。火花流驱动程序进程内存不足

以下是详细信息:

我有一个简单的火花流媒体应用程序,从MQTT数据源消耗事件,并​​在数据库中存储这些。我正在使用一个具有1个主节点和2个工作节点的小型火花集群。我有1个驱动程序进程(开始使用spark-submit和部署模式客户端)提供集群。我在Ubuntu上使用Java8(Oracle VM)运行spark-1.4.1-bin-hadoop2.6。

我的驱动程序基本上如下:

JavaReceiverInputDStream<String> messages = createInputDStream(ssc); 
messages.mapPartitions(...).mapToPair(...).updateStateByKey(...). 
    foreachRDD(rdd -> { 
    rdd.foreach(ne -> { 
    }); 
    return null; 
    }); 

我已经做了初步调查。如果我参加了驾驶过程中的堆转储收集实例的直方图(JMAP -histo),我通常会看到这样的东西:

1:   36388  81204168 [B 
    2:  407486  32826432 [C 
    3:   40849  25067224 [I 
    4:  367245  8813880 scala.collection.immutable.$colon$colon 
    5:  311000  7464000 java.lang.String 
    6:  114294  7314816 org.apache.spark.storage.RDDInfo 

我注意到,随着时间的推移,RDDInfo对象的数量在增加。堆转储显示大部分RDDINfo对象保留在JobProgressListener的stageIdToData映射中。看看这个类的代码,它似乎应该注意丢弃旧数据。因此,我已经在conf/spark-defaults.conf中设置了

spark.ui.retainedJobs  50 
spark.ui.retainedStages 50 

。但是这并没有帮助。从我的转储中,我看到这个stageIdToData地图包含1897个条目。鉴于上述配置设置,这看起来很奇怪。

我在这里做错了什么,或者这是一个火花问题?

+0

您是否解决了这个问题?我遇到了与检查点到S3相同的问题。 – Navneet

+0

我不这么认为。很久以前,我很久以前就开始工作了。 – user2519865

回答

0

您是否在应用程序的驱动程序端执行任何操作?就像获取数据并处理它,保存在内存中一样?

+0

不,我不是。这是我的驱动程序循环。 asEvents(messages).foreachRDD(rdd - > { rdd.foreach(ne - > { }); return null; }); – user2519865

1

由于您使用的是updateStateByKey,因此您的流必须是checkpointing。尝试减少检查点间隔。

在你的记忆快照中,你有一堆数组。谁在坚持这些?

+0

是的,我正在检查点。减少间隔不只是推迟厄姆? [B来自最终来自netty缓冲区的ThreadLocal(来自shuffle-server-0线程)。 [C来自SparkContext中的JobProgressListener。 [我也来自JobProgressListener。 – user2519865