2

我有一个非常奇怪的内存问题(这是很多人很可能会说的 ;-)),Spark 在 Docker 容器内以独立模式运行。我们的设置如下:我们有一个 Docker 容器,其中有一个 Spring Boot 应用程序,它以独立模式运行 Spark。这个 Spring 启动应用程序还包含一些计划任务(由 Spring 管理)。这些任务触发 Spark 作业。Spark 作业抓取一个 SQL 数据库,稍微打乱数据,然后将结果写入不同的 SQL 表(写入结果不通过 Spark)。我们当前的数据集非常小(表包含几百万行)。

问题是运行 Docker 容器的 Docker 主机(一个 CentOS 虚拟机)在一段时间后由于内存耗尽而崩溃。我目前已将 Spark 内存使用限制为 512M(我已设置执行程序和驱动程序内存),在 Spark UI 中,我可以看到最大的作业只需要大约 10 MB 的内存。我知道如果 Spark 有 8GB 或更多可用内存,它运行得最好。我也试过了,但结果是一样的。

在进一步挖掘之后,我注意到 Spark 耗尽了机器上的所有缓冲区/缓存内存。通过强制 Linux 删除缓存(echo 2 > /proc/sys/vm/drop_caches)(清除 dentries 和 inode)手动清除它后,缓存使用率会大大下降,但如果我不经常这样做,我会看到缓存使用量会缓慢上升,直到缓冲区/缓存中的所有内存都用完。

有谁知道我可能做错了什么/这里发生了什么?

非常感谢您的帮助!

4

0 回答 0