Свысока куча памяти конфиг и вольфрам
Я думал, что с интеграцией проекта Tungesten, spark будет автоматически использовать кучу памяти.
Для чего нужны spark.memory.offheap.size и spark.memory.offheap.enabled? Нужно ли мне вручную указывать здесь объем памяти вне кучи для Tungsten?
1 ответ
Spark/Tungsten используют кодеры / декодеры для представления объектов JVM в качестве узкоспециализированных объектов Spark SQL Types, которые затем могут быть сериализованы и обработаны с высокой производительностью. Внутреннее представление формата очень эффективно и дружественно к использованию памяти GC.
Таким образом, даже работая в стандартном режиме работы в куче, Tungsten уменьшает большие затраты на расположение памяти объектов JVM и время работы GC. Вольфрам в этом режиме действительно выделяет объекты в куче для своих внутренних целей, и выделения памяти могут быть огромными, но это происходит гораздо реже и плавно переживает переходы генерации GC. Это почти исключает необходимость рассмотреть возможность удаления этой внутренней структуры из кучи.
В наших экспериментах с этим режимом мы не видели значительных улучшений во время выполнения. Но то, что вы получаете при включенном режиме вне кучи, - это то, что нужно тщательно спроектировать распределение памяти вне процесса JVM. Это может вызвать некоторые трудности в менеджерах контейнеров, таких как YARN, Mesos и т. Д., Когда вам потребуется разрешить и спланировать дополнительные куски памяти помимо конфигурации процесса JVM.
Также в режиме без кучи Tungsten использует sun.misc.Unsafe, что может быть нежелательным или даже невозможным в ваших сценариях развертывания (например, с ограничительной конфигурацией менеджера безопасности Java).
Я также делюсь выступлением Джоша Розена с видеоконференцией, посвященной времени, когда ему задают аналогичный вопрос.
Зачем включены spark.memory.offheap.size и spark.memory.offheap.? spark.memory.offHeap.enabled: параметр для включения / отключения использования памяти вне кучи. spark.memory.offHeap.size: общий объем памяти в байтах для выделения вне кучи (из собственной памяти). Это не влияет на использование памяти кучи, также убедитесь, что не превышены общие ограничения вашего исполнителя.
Нужно ли мне вручную указывать здесь объем внепалевой памяти для Tungsten? Да. Помимо включения памяти OffHeap, вам необходимо вручную установить ее размер, чтобы использовать память Off-Heap для приложений Spark. Обратите внимание, что модель памяти Off-heap включает только память Storage и память Execution.
На изображении ниже представлена абстрактная концепция работы памяти вне кучи.
• Если включена память Off-heap, в Executor будет как On-heap, так и Off-heap память.
• Память для хранения Executor = Storage Memory On-Heap + Storage Memory Off-Heap
• Память исполнения Executor = память исполнения On-Heap + Память исполнения Off-Heap