Модель управления памятью Spark, описанная в этой статье, устарела в Apache Spark v1.6.0+, ссылку на новую модель памяти можно найти в этой статье.

Вот схема распределения памяти Spark внутри кучи JVM в соответствии с моделью управления памятью до Apache Spark v1.6.0:

Давайте разберемся, что это за разные компоненты один за другим:

  1. Безопасная куча. Любой процесс Spark, работающий в кластере или на локальном компьютере, является процессом JVM. Как и для любого процесса JVM, размер кучи можно настроить с помощью флагов -Xmx и -Xms. По умолчанию Apache Spark запускается с кучей JVM объемом 512 МБ. Чтобы избежать ошибки «Недостаточно памяти», Spark позволяет использовать только 90 % всей кучи в качестве безопасной кучи, которая контролируется параметром spark.storage.safetyFraction. Процесс Spark работал над этой безопасной памятью кучи.
  2. Память для хранения: Spark позволяет хранить некоторые данные в памяти и использует память для своего кэша LRU (наименее использовавшегося). Итак, по умолчанию 60% памяти безопасной кучи зарезервировано для этого кэширования обрабатываемых данных. Эта доля управляется параметром spark.storage.memoryFraction. Итак, данные, которые можно кэшировать = Размер кучи * spark.storage.safetyFraction * spark.storage.memoryFraction.Например,если у вас есть размер кучи 8 ГБ, то данные, которые вы можете кэшировать, составляют 8192 * 0,9 * 0,6 = 4423 МБ.
  3. Случайная память. Теперь давайте разберемся, что такое смешанная память. Он рассчитывается как Размер кучи * spark.shuffle.safetyFraction * spark.shuffle.memoryFraction. По умолчанию spark.shuffle.safetyFraction равен 0,8, а spark.shuffle.memoryFraction — 0,2. Таким образом, Shuffle Memory по умолчанию составляет 16% (0,8*0,2 = 0,16) от кучи JVM. Spark использует эту память для задачи перемешивания. Перемешивание – это процесс перераспределения данных между разделами, который может привести или не привести к перемещению данных между процессами JVM. Spark использует эту память для хранения данных при выполнении задачи перемешивания. Возьмем пример, иногда во время перемешивания происходит сортировка данных. Обычно для хранения отсортированных данных требуется буфер (данные в кэше LRU не могут быть изменены, поскольку они предназначены для повторного использования позже). Поэтому для хранения отсортированных фрагментов данных требуется некоторый объем оперативной памяти, т. Е. Shuffle Memory.
    ShuffleMemoryManagerуправляет памятью в случайном порядке,выделяя пул памяти потокам задач для использования в операции перемешивания.
  4. Развернуть память. Spark позволяет хранить данные как в сериализованной, так и в десериализованной форме. Данные в сериализованной форме нельзя использовать напрямую. Это память, которая используется, когда Spark разворачивает блок данных в память. Память развертывания используется совместно с памятью хранилища, а это означает, что если вам потребуется память для развертывания данных, это может привести к удалению некоторых разделов, хранящихся в кэше Spark LRU. Объем ОЗУ, который разрешено использовать процессу развертывания, равен spark.storage.unrollFraction * spark.storage.memoryFraction * spark.storage. securityFraction, по умолчанию это 10,8% кучи (0,2 * 0,6 * 0,9 = 0,108).

Я надеюсь, что эта статья помогла понять модель управления памятью Apache Spark.