Spark 驱动程序中的内存泄漏

Posted

技术标签:

【中文标题】Spark 驱动程序中的内存泄漏【英文标题】:Memory leak in Spark Driver 【发布时间】:2019-09-13 10:17:27 【问题描述】:

我使用的是 Spark 2.1.1,并升级到了最新版本 2.4.4。我从 Spark UI 观察到驱动程序内存不断增加,长时间运行后出现以下错误:java.lang.OutOfMemoryError: GC 开销限制超出

在 Spark 2.1.1 中,驱动程序的内存消耗(存储内存选项卡)非常低,并且在运行 ContextCleaner 和 BlockManager 之后,内存正在减少。

此外,我测试了 Spark 版本 2.3.3、2.4.3,我的行为相同。

如何重现这种行为:

创建一个非常简单的应用程序(streaming count_file.py)以重现此行为。此应用程序从目录中读取 CSV 文件,计算行数,然后删除处理过的文件。

import os

from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql import types as T

target_dir = "..."

spark=SparkSession.builder.appName("DataframeCount").getOrCreate()

while True:
    for f in os.listdir(target_dir):
        df = spark.read.load(f, format="csv")
        print("Number of records: 0".format(df.count()))

        os.remove(f)
        print("File 0 removed successfully!".format(f))

提交代码:

spark-submit 
--master spark://xxx.xxx.xx.xxx
--deploy-mode client
--executor-memory 4g
--executor-cores 3
--queue streaming count_file.py

具有相同行为的测试用例:

我使用默认设置 (spark-defaults.conf) 进行了测试 添加 spark.cleaner.periodicGC.interval 1 分钟(或更短) 转 spark.cleaner.referenceTracking.blocking=false 以集群模式运行应用程序 增加/减少执行者和驱动的资源 我在驱动程序和执行程序中使用 extraJavaOptions 进行了测试 -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=35 -XX:ConcGCThreads=12

依赖关系

操作系统:Ubuntu 16.04.3 LTS Java:jdk1.8.0_131(也用 jdk1.8.0_221 测试过) Python:Python 2.7.12

【问题讨论】:

csv 文件有多大?从你的信息来看,我没有看到你设置了驱动内存这个参数。 @DennisLi 我所描述的行为与 CSV 的大小或驱动程序内存无关。我使用小型 CSV (2-3M) 和大型 CSV (200-300M) 以及不同的驱动程序内存 (1G -15G) 进行了测试。在给定的代码中,spark使用默认的驱动内存1G 我认为您需要使用 spark-submit 设置驱动程序内存参数。 spark-submit --driver-memory 10g 例如。 @DennisLi 你可以在Spark submit或者spark-defaults.conf中设置驱动内存凋谢,我已经在spark-defaults.conf中设置了,不过这个和问题无关。 你解决了这个问题吗?我也遇到了类似的问题 【参考方案1】:

最后,Spark UI 中内存的增加是 Spark 版本高于 2.3.3 的一个 bug。有一个修复。 它将影响 Spark 版本 2.4.5+

Spark 相关问题:

Spark UI 存储内存超时增加: https://issues.apache.org/jira/browse/SPARK-29055

Spark 中可能存在内存泄漏: https://issues.apache.org/jira/browse/SPARK-29321?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel

【讨论】:

以上是关于Spark 驱动程序中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 1.6.0 中调试“检测到托管内存泄漏”

使用 Kafka 直接流在 Yarn 上引发堆内存泄漏

如何解决 xcode(仪器)中的 iPhone 应用程序内存泄漏

c#应用程序中的ODBC泄漏内存

iPad 和 iPhone 应用程序中的内存泄漏

转储内存以查找 C++ 应用程序中的内存泄漏