我在我的应用程序中使用 Spark 流。数据每 15 分钟以流文件的形式出现。我已经分配了 10G 的 RAM 来激发执行程序。使用此设置,我的 Spark 应用程序运行良好。
但是通过查看 spark UI,在 存储选项卡 -> 内存中的大小 下,RAM 的使用量随着时间的推移不断增加。
当我开始流式传输作业时,“内存中的大小”使用量以 KB 为单位。从我开始流式传输工作到现在,已经过去了 2 周 2 天 22 小时,使用量增加到 858.4 MB。
我也注意到了更多的事情,在 Streaming 标题下:
当我开始工作时, 处理时间 和 总延迟 (来自图像)为 5 秒,16 天后增加到 19-23 秒,而流文件大小几乎相同。
在将执行程序内存增加到 10G 之前,spark 作业几乎每 5 天就会失败一次(默认执行程序内存为 1GB)。 executor内存增加到10G,从16天以上开始持续运行。
我担心内存问题。如果“内存中的大小”值像这样继续增加,那么迟早我会用完 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。
最佳答案
不,这不是 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/