Вручную вызывать сбор мусора из pyspark

Я выполнял рабочий процесс на некоторых 3 миллионах записей по 15 столбцов на всех строках на моем 4-ядерном 16-гигабайтном компьютере, используя pyspark 1.5 в локальном режиме. Я заметил, что если я снова запустил тот же рабочий процесс, не перезапустив искру, память закончится, и я получаю Out of Memory Exceptions.

Поскольку все мои тайники суммируются примерно до 1 ГБ, я думал, что проблема кроется в сборке мусора. Мне удалось запустить сборщик мусора python вручную, вызвав:

import gc
collected = gc.collect()
print "Garbage collector: collected %d objects." % collected

Это немного помогло.

Я играл с настройками искрового GC в соответствии с этой статьей, и попытался сжать RDD и сменить сериализатор на Kyro, Это замедлило обработку и мало помогло с памятью.

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

Ответ 1

Вам не нужно вручную вызывать GC. Если у вас было OOMException, потому что больше нет памяти. Вы должны искать утечку памяти, а также ссылки, которые вы храните в своем коде.  Если вы выпустите эти ссылки, JVM сделает свободное пространство, когда это необходимо.

Ответ 3

Это пока невозможно, есть несколько заявок на выполнение "задачи управления" для всех исполнителей:

Но еще не завершено.

Вы можете попытаться вызвать JVM GC при выполнении рабочего кода, это сработает. Например, при создании карты RDD, но я уверен, что при правильной настройке вы можете избавиться от OOM.

Наиболее важным параметром является доля, которую вы spark.memory.fraction между Java Heap и кеш-памятью RDD: spark.memory.fraction, иногда лучше установить очень низкое значение (например, 0,1), а иногда увеличить его.

Более подробная информация на https://spark.apache.org/docs/2.2.0/tuning.html#memory-management-overview