【发布时间】:2015-12-18 15:45:03
【问题描述】:
我已尝试升级到 Apache Spark 1.6.0 RC3。我的应用程序现在几乎每项任务都会出现这些错误:
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-10000) 了解不多。泄漏可能是我的错还是可能是 Spark 错误?
【问题讨论】:
-
您是否尝试使用设置在调试级别的记录器来运行?
-
谢谢!我现在使用
<logger name="org.apache.spark.memory.TaskMemoryManager" level="DEBUG" />运行,并记录了分配和解除分配。仍然不知道发生了什么:)。稍后我会添加更多细节。 -
我已经添加了日志。有两个 5MB
acquire调用和一个 5MBrelease调用。但为什么呢? -
您在使用数据框吗?在尝试操作数据帧时,我开始出现大量此类错误。内存泄漏似乎与 Java 进程有关,随着应用程序的运行,它会不断地消耗更多的内存。
-
不,这是没有 DataFrames 的。我不认为这是Java的事情。这由 Spark 的内存管理器记录,其中任务可以显式获取和释放内存。任务结束,但有些东西没有发布。内存管理器会自动释放这个,但会记录这个警告,让我们知道有问题。
标签: apache-spark