Подтвердить что ты не робот

Отладка "Обнаружена утечка управляемой памяти" в Spark 1.6.0

Я пробовал обновление до 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). Является ли утечка вероятной моей ошибкой или это скорее ошибка искры?

4b9b3361

Ответ 1

Короткий ответ заключается в том, что пользователи не должны видеть это сообщение. Пользователи не должны создавать утечки памяти в унифицированном менеджере памяти.

То, что такие утечки происходят, это ошибка Spark: SPARK-11293


Но если вы хотите понять причину утечки памяти, вот как я это сделал.

  • Загрузите исходный код Spark и убедитесь, что вы можете его создать, и ваша сборка работает.
  • В TaskMemoryManager.java добавить дополнительный журнал в acquireExecutionMemory и releaseExecutionMemory: logger.error("stack trace:", new Exception());
  • Измените все остальные журналы отладки на ошибку в TaskMemoryManager.java. (Проще, чем выяснять конфигурации протоколирования...)

Теперь вы увидите полную трассировку стека для всех распределений и освобождений. Постарайтесь сопоставить их и найти распределения без освобождения. Теперь у вас есть трассировка стека для источника утечки.