【发布时间】:2015-09-07 13:57:24
【问题描述】:
我在 spark 流应用程序中遇到了驱动程序进程的问题。问题是驱动程序进程内存不足。主节点和工作节点都没有问题(它们连续几天都运行良好)。但即使提要非常有限(每 5 分钟两条消息,处理 1 条消息所需的时间不到 100 毫秒)一段时间后(例如周末),我在驱动程序进程中遇到 oom 错误。
这里有更多细节:
我有一个简单的 spark-streaming 应用程序,它使用来自 mqtt 数据源的事件并将这些事件存储在数据库中。我正在使用一个带有 1 个主节点和 2 个工作节点的小型 spark 集群。我有 1 个驱动程序进程(使用带有部署模式客户端的 spark-submit 开始)为集群提供服务。我正在使用 Java8 (Oracle VM) 在 Ubuntu 上运行 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 对象的数量正在增加。堆转储显示大部分 RDDINInfo 对象保存在 JobProgressListener 的 stageIdToData 映射中。查看该类的代码,它似乎应该处理丢弃旧数据。因此,我已经设置了
spark.ui.retainedJobs 50
spark.ui.retainedStages 50
在 conf/spark-defaults.conf 中。但这没有帮助。从我的转储中,我看到这个 stageIdToData 映射包含 1897 个条目。鉴于上述配置设置,这对我来说看起来很奇怪。
我在这里做错了什么还是火花问题?
【问题讨论】:
-
你解决了这个问题吗?我在检查点到 S3 时遇到了同样的问题。
-
我不这么认为。那是很久以前的事了,我早就换工作了。
标签: apache-spark spark-streaming