apache-spark - Spark 驱动程序中的内存泄漏

标签 apache-spark

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

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

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

如何重现这种行为:

创建一个非常简单的应用程序(流式 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
  • 最佳答案

    最后,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
  • 关于apache-spark - Spark 驱动程序中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57921719/

    相关文章:

    python - 如何计算 Pyspark 中 None 或 NaN 值的百分比?

    apache-spark - Spark Dataframe 中基于行值序列的复杂行分组

    python - 如何从 pyspark 数据帧更快地保存 csv 文件?

    hadoop - Spark 不利用 parquet 的 hdfs 分区

    java - Hadoop MapReduce 中 Map/Combine 之后和 Reduce 阶段之前的数据保存在哪里?

    apache-spark - Spark CPU 利用率监控

    scala - 为什么 Spark DataFrame 转换为 RDD 需要完全重新映射?

    spring - 将Spring Boot应用程序jar提交到Spark-Submit

    python - pyspark : Save schemaRDD as json file

    r - 从 Sparklyr 中提取模型树并进行可视化