Вручную вызывать сбор мусора из 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 сделает свободное пространство, когда это необходимо.
Ответ 2
Я полагаю, что это вызовет GC (подсказку) в JVM:
spark.sparkContext._jvm.System.gc()
Смотрите также: Как форсировать сборку мусора в Java?
и: Java: Как вы на самом деле форсируете сборщик мусора, используя JVMTI ForceGargabeCollection?
Ответ 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