Apache spark spark流媒体驱动程序进程内存不足

Apache spark spark流媒体驱动程序进程内存不足,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我对spark流媒体应用程序中的驱动程序进程有问题。问题是驱动程序进程内存不足。主节点和工作节点都没有问题(它们连续几天都运行良好)。但是,即使使用非常有限的提要(每5分钟两条消息,处理一条消息所需的时间不到100毫秒),我也会在一段时间后(例如,一个周末)在驱动程序进程中出现oom错误 详情如下: 我有一个简单的spark流应用程序,它使用mqtt数据源中的事件并将这些事件存储在数据库中。我正在使用一个小的spark集群,它有1个主节点和2个工作节点。我有一个驱动程序进程(使用spark su

我对spark流媒体应用程序中的驱动程序进程有问题。问题是驱动程序进程内存不足。主节点和工作节点都没有问题(它们连续几天都运行良好)。但是,即使使用非常有限的提要(每5分钟两条消息,处理一条消息所需的时间不到100毫秒),我也会在一段时间后(例如,一个周末)在驱动程序进程中出现oom错误

详情如下:

我有一个简单的spark流应用程序,它使用mqtt数据源中的事件并将这些事件存储在数据库中。我正在使用一个小的spark集群,它有1个主节点和2个工作节点。我有一个驱动程序进程(使用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;
  });
我注意到,随着时间的推移,RDDInfo对象的数量在增加。堆转储显示大部分RDDINfo对象保存在JobProgressListener的stageIdToData映射中。看看这个类的代码,它似乎应该注意扔掉旧数据。因此,我已经设置了

spark.ui.retainedJobs      50
spark.ui.retainedStages    50
在conf/spark-defaults.conf中。但那没用。从我的转储文件中,我看到这个stageIdToData映射包含1897个条目。考虑到上述配置设置,我觉得这很奇怪


我在这里做错了什么,还是这是一个火花问题?您在应用程序的驱动端做了什么?像获取数据并对其进行处理,将其保存在内存中一样?

因为您使用的是
updateStateByKey
,所以您必须是您的流。尝试减少检查点间隔


在内存快照中有一组数组。谁拿着那些?

是的,我在检查。缩短间隔是否会推迟oom?[B来自ThreadLocal(来自shuffle-server-0线程),该线程最终来自netty缓冲区。[C来自SparkContext中的JobProgressListener。[I也来自JobProgressListener。不,我不是。这是我的驱动程序循环。asEvents(messages)。foreachRDD(rdd->{rdd.foreach(ne->{});return null;});您解决了这个问题吗?我遇到了与S3检查点相同的问题。我不这么认为。这是很久以前的事了,我很久以前就换了工作。
spark.ui.retainedJobs      50
spark.ui.retainedStages    50