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

Apache spark “调试”;“检测到托管内存泄漏”;在Spark 1.6.0中,apache-spark,Apache Spark,我已经尝试升级到ApacheSpark1.6.0RC3。我的应用程序现在几乎在每项任务中都会出现以下错误: Managed memory leak detected; size = 15735058 bytes, TID = 830 我已将org.apache.spark.memory.TaskMemoryManager的日志记录级别设置为DEBUG,并在日志中查看: I2015-12-18 16:54:41,125 TaskSetManager: Starting task 0.0 in s

我已经尝试升级到ApacheSpark1.6.0RC3。我的应用程序现在几乎在每项任务中都会出现以下错误:

Managed memory leak detected; size = 15735058 bytes, TID = 830
我已将
org.apache.spark.memory.TaskMemoryManager
的日志记录级别设置为
DEBUG
,并在日志中查看:

I2015-12-18 16:54:41,125 TaskSetManager: Starting task 0.0 in stage 7.0 (TID 6, localhost, partition 0,NODE_LOCAL, 3026 bytes)
I2015-12-18 16:54:41,125 Executor: Running task 0.0 in stage 7.0 (TID 6)
I2015-12-18 16:54:41,130 ShuffleBlockFetcherIterator: Getting 1 non-empty blocks out of 1 blocks
I2015-12-18 16:54:41,130 ShuffleBlockFetcherIterator: Started 0 remote fetches in 0 ms
D2015-12-18 16:54:41,188 TaskMemoryManager: Task 6 acquire 5.0 MB for null
I2015-12-18 16:54:41,199 ShuffleBlockFetcherIterator: Getting 1 non-empty blocks out of 1 blocks
I2015-12-18 16:54:41,199 ShuffleBlockFetcherIterator: Started 0 remote fetches in 0 ms
D2015-12-18 16:54:41,262 TaskMemoryManager: Task 6 acquire 5.0 MB for null
D2015-12-18 16:54:41,397 TaskMemoryManager: Task 6 release 5.0 MB from null
E2015-12-18 16:54:41,398 Executor: Managed memory leak detected; size = 5245464 bytes, TID = 6
如何调试这些错误?是否有办法记录分配和解除分配的堆栈跟踪,以便找到泄漏的内容


我对新的统一内存管理器()知之甚少。泄漏可能是我的错还是火花虫?

简单的回答是用户不应该看到此消息。用户不能在统一内存管理器中创建内存泄漏

发生此类泄漏是一个火花缺陷:


但是如果你想了解内存泄漏的原因,我就是这样做的

  • 下载Spark源代码,确保您可以构建它,并且您的构建工作正常
  • TaskMemoryManager.java
    中,在
    acquireExecutionMemory
    releaseExecutionMemory
    中添加额外的日志记录:
    logger.error(“堆栈跟踪:,新异常())
  • taskmorymanager.java
    中的所有其他调试日志更改为error。(比计算日志记录配置更容易…)

  • 现在,您将看到所有分配和解除分配的完整堆栈跟踪。尝试匹配它们,并在不取消分配的情况下找到分配。您现在有了泄漏源的堆栈跟踪。

    我也发现了此警告消息,但它是由“df.repartition(rePartNum,df(“id”)”引起的”。 我的df为空,警告消息的行等于rePartNum。 版本: spark2.4
    win10

    您是否尝试将记录器设置为调试级别运行?谢谢!我现在已经运行了
    ,分配和解除分配都会被记录下来。但仍然不知道发生了什么:)。我将在稍后添加更多详细信息。我已经添加了日志。有两个5MB
    acquire
    调用,只有一个5MB
    release
    调用。但是为什么?你在用数据帧吗?当我试图操作数据帧时,我开始出现一系列这样的错误。内存泄漏似乎与Java进程有关,Java进程在应用程序运行时不断占用更多内存。不,这是没有数据帧的。我不认为这是Java的东西。这由Spark的内存管理器记录,任务可以在其中显式获取和释放内存。任务结束了,但有些东西没有发布。内存管理器会自动释放该命令,但记录此警告以让我们知道有什么东西被窃听。我在EMR 16/04/14 13:49:10上运行spark streaming时看到此异常。WARN memory.taskmorymanager:org.apache.spark.unsafe.map中泄漏32.3 MB内存。BytesToBytesMap@34158d5f16/04/14 13:49:10错误执行器。执行器:检测到托管内存泄漏;size=33816576字节,TID=2942915 16/04/14 13:49:10错误执行器。执行器:任务22.0在35684.0阶段出现异常(TID 2942915)java.lang.OutOfMemory错误:无法获取262144字节内存,获得220032所有这些注释是否意味着,如果由于公司IT就绪,我还不能升级到“良好”版本,我可以安全地忽略错误吗?我目前正在使用spark 1.6.0,当某些数据帧执行“distinct”然后执行“head”时,会出现类似这样的错误。如果忽略它是您唯一的选择,我建议您忽略它:)。它可能会导致内存不足问题,这是关于内存错误记帐的警告。我们在spark 2.3.1上看到了它。知道为什么吗?可能是个虫子!我会把这件事提交给JIRA,看看是否有人能找到它。