java - Spark UI 的存储选项卡下的 "Size in Memory"显示随着时间的推移,Spark 流的 RAM 使用量增加

标签 java apache-spark spark-streaming

我在我的应用程序中使用了 Spark Streaming。数据每 15 分钟以流文件的形式出现。我已经分配了 10G 的 RAM 给 spark executors。通过此设置,我的 spark 应用程序运行良好。 但是通过查看 spark UI,在 Storage 选项卡 -> Size in Memory 下,RAM 的使用量随着时间的推移不断增加。 enter image description here 当我开始流式处理作业时,“内存中的大小”使用量以 KB 为单位。今天,自从我开始流媒体工作以来已经过去了 2 周 2 天 22 小时,使用量已增加到 858.4 MB。 我还注意到更多的东西,在 Streaming 标题下: enter image description here

当我开始工作时,Processing TimeTotal Delay(来自图像)是 5 秒,16 天后增加到 19-23 秒,而流文件大小几乎相同。 在将执行程序内存增加到 10G 之前,spark 作业几乎每 5 天就会失败一次(默认执行程序内存为 1GB)。随着执行器内存增加到10G,连续运行16天以上。

我担心内存问题。如果“Size in Memory”值继续像这样增加,那么迟早我会用完 RAM 并且 spark 作业将再次失败,同时 10G 的执行程序内存也是如此。我能做些什么来避免这种情况?我需要做一些配置吗?

为了提供我的 spark 应用程序的上下文,我在 spark 上下文中启用了以下属性:

SparkConf sparkConf = new SparkConf().setMaster(sparkMaster).                               .set("spark.streaming.receiver.writeAheadLog.enable", "true")
        .set("spark.streaming.minRememberDuration", 1440);

此外,我还启用了如下检查点:

sc.checkpoint(hadoop_directory)

我还想强调一件事,我在启用检查点时遇到了问题。关于检查点问题,我已经在以下链接上发布了一个问题: Spark checkpoining error when joining static dataset with DStream

我无法按照我想要的方式设置检查点,所以采用了不同的方式(上面突出显示)并且现在工作正常。我不会再问检查点问题,但我提到它是为了帮助您了解当前内存问题是否与前一个问题(检查点)有某种关联。

环境细节: Spark 1.4.1 带有两个 centos 7 机器节点集群。 Hadoop 2.7.1。

最佳答案

I am worried about the memory issues. If "Size in Memory" values keep on increasing like this, then sooner or later I will run out of RAM and spark job will get fail again with 10G of executor memory as well.

不,RAM 不是这样工作的。用完是完全正常的,当用完时,您会将用于次要目的的 RAM 用于更重要的目的。

例如,如果您的系统有空闲 RAM,它可以尝试将写入磁盘的所有内容保存在 RAM 中。谁知道呢,有人可能会尝试再次从磁盘读取它并将它放在 RAM 中将节省 I/O 操作。由于免费 RAM 永远被浪费了(这不像你今天可以少使用 1GB 明天多使用 1GB,任何现在不使用的 RAM 都有可能避免永远丢失的 I/O)你不妨将它用于任何可能有帮助的事情.但这并不意味着它不能在需要 RAM 用于其他目的时从 RAM 中驱逐这些东西。

在一个典型的系统上,几乎所有的 RAM 都被使用并且几乎所有的 RAM 都可用是很正常的。这是大多数现代系统的典型行为。

关于java - Spark UI 的存储选项卡下的 "Size in Memory"显示随着时间的推移,Spark 流的 RAM 使用量增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35478223/

相关文章:

python - 如何在 PySpark 的 RDD 的列中查找标准偏差

scala - 在 Spark 中将 sqlContext 作为隐式参数传递

apache-spark - 使用Delta Lake,如何在压缩后删除原始文件

spark-streaming - 具有多个 Kafka 流的 Spark Streaming

java - classLoader.getResource (".") 是/bin文件夹

java - 如何在 Restful Web 服务中编辑默认 URL

java - 尝试创建一个方法来清除java中链表中的所有节点

java - 从 Jackson 2 中的共享 ObjectMapper 构造 ObjectWriter 的特定实例以忽略空字段

scala - Spark mesos集群模式比本地模式慢

apache-spark - Spark saveAsNewAPIHadoopFile 适用于本地模式,但不适用于集群模式