#apache-spark #caching #out-of-memory #rdd #partitioning
#apache-spark #кэширование #нехватка памяти #rdd #разделение
Вопрос:
Я новичок в spark и не могу найти четкого ответа на вопрос, что происходит, когда кэшированные данные не помещаются в память?
во многих местах я обнаружил, что если RDD не помещается в память, некоторые разделы не будут кэшироваться и будут пересчитываться «на лету» каждый раз, когда они понадобятся.
например: допустим, создан раздел 500, а раздел 200 не был кэширован, затем снова нам нужно повторно вычислить оставшийся раздел 200, повторно оценив RDD.
Если это так, то ошибка ООМ никогда не должна возникать, но она возникает.В чем причина?
Подробное объяснение высоко ценится.Заранее спасибо
Ответ №1:
Существуют различные способы сохранения вашего фрейма данных в spark.
1)Сохраняться (СОХРАНЯЕМОСТЬ ТОЛЬКО в MEMORY_ONLY)
при сохранении фрейма данных с помощью MEMORY_ONLY он будет кэширован в разделе spark.cached.memory как десериализованные объекты Java. Если RDD не помещается в память, некоторые разделы не будут кэшироваться и будут пересчитываться «на лету» каждый раз, когда они понадобятся. Это уровень по умолчанию и иногда может вызывать ООМ, когда RDD слишком большой и не может поместиться в памяти (это также может произойти после попытки пересчета).
Чтобы ответить на ваш вопрос
Если это так, то ошибка ООМ никогда не должна возникать, но она возникает.В чем причина? даже после пересчета вам нужно поместить эти rdd в память. если свободного места нет, GC попытается очистить какую-то часть и попытаться выделить ее. если это не удастся, то произойдет сбой с ООМ
2)Сохраняться (MEMORY_AND_DISK)
при сохранении фрейма данных с помощью MEMORY_AND_DISK он будет кэширован в разделе spark.cached.memory как десериализованные объекты Java, если память недоступна в куче, то он будет перенесен на диск. для решения проблем с памятью произойдет сброс некоторой части данных или полных данных на диск. (примечание: убедитесь, что на узлах достаточно места на диске, в противном случае будут всплывать ошибки отсутствия места на диске)
3)Сохраняется (MEMORY_ONLY_SER) при сохранении фрейма данных с помощью MEMORY_ONLY_SER он будет кэшироваться в разделе spark.cached.memory в виде сериализованных объектов Java (однобайтовый массив на раздел). обычно это более экономично по сравнению с MEMORY_ONLY, но требует больших затрат процессора, поскольку задействовано сжатие (общее предложение здесь — использовать Kyro для сериализации), но при этом все еще возникают проблемы с ООМ, аналогичные MEMORY_ONLY.
4)Сохраняется (MEMORY_AND_DISK_SER) это похоже на MEMORY_ONLY_SER, но одно отличие заключается в том, что при отсутствии свободного места в куче массив RDD будет перенесен на диск так же, как и (MEMORY_AND_DISK) … мы можем использовать эту опцию, когда у вас жесткие ограничения на дисковое пространство и вы хотите уменьшить трафик ввода-вывода.
5) Сохраняемость (DISK_ONLY) В этом случае память кучи не используется.RDD сохраняются на диске. убедитесь, что на диске достаточно места, и этот параметр приведет к огромным накладным расходам на ввод-вывод. не используйте это, когда у вас есть фреймы данных, которые используются неоднократно.
6)Сохраняемость (MEMORY_ONLY_2 или MEMORY_AND_DISK_2) Они аналогичны вышеупомянутым MEMORY_ONLY и MEMORY_AND_DISK. единственное отличие заключается в том, что эти параметры реплицируют каждый раздел на двух узлах кластера на всякий случай .. используйте эти параметры при использовании точечных экземпляров.
7)Сохраняемая (OFF_HEAP) память вне кучи обычно содержит стеки потоков, код приложения контейнера spark, сетевые буферы ввода-вывода и другие буферы приложений ОС. даже вы можете использовать эту часть памяти из RAM для кэширования вашего RDD с помощью вышеупомянутой опции.
Комментарии:
1. спасибо за подробное объяснение сохранения (ТОЛЬКО в ПАМЯТИ).