apache-spark - Spark 驱动程序中的内存泄漏
问题描述
我使用了 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 1min(或更短)
- 开启 spark.cleaner.referenceTracking.blocking=false
- 以集群模式运行应用程序
- 增加/减少executors和driver的资源
- 我在驱动程序和执行程序中使用 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+。
火花相关问题:
推荐阅读
- c# - 为什么我的代码中的 SQL 命令在运行时被“TODO: FUNC”替换?
- node.js - OAuth2 登录后重定向到前端(在不同的 URL 上)
- ruby - 如何在 IntelliJ 中设置 ruby 分析器
- python - 用整数而不是元组更新列
- java - 给定的工件包含一个带有包引用“android.support.v4.widget”的字符串文字,无法安全地重写
- angular - 触发 Angular 异步 FormGroup 验证
- python - 使用python根据csv中的列分组
- node.js - 如何将 Docker 用于 Windows 内置的 ElectronJS 应用程序?
- unit-testing - 颤振单元测试。运行测试时出错
- python - 为什么TF-IDF的值与IDF_不同?