我在火花流应用程序中的驱动程序进程有问题。问题是驱动程序进程内存不足。主节点和工作节点都没有问题(它们都运行良好,连续数天)。但即使使用非常有限的馈送(每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个条目。鉴于上述配置设置,这看起来很奇怪。
我在这里做错了什么,或者这是一个火花问题?
您是否解决了这个问题?我遇到了与检查点到S3相同的问题。 – Navneet
我不这么认为。很久以前,我很久以前就开始工作了。 – user2519865