Я думал, что с интеграцией проекта Tungesten искра автоматически будет использовать память кучи.
Зачем нужны spark.memory.offheap.size и spark.memory.offheap.enabled? Нужно ли вручную указывать количество памяти кучи для вольфрама здесь?
Я думал, что с интеграцией проекта Tungesten искра автоматически будет использовать память кучи.
Зачем нужны spark.memory.offheap.size и spark.memory.offheap.enabled? Нужно ли вручную указывать количество памяти кучи для вольфрама здесь?
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.enabled? spark.memory.offHeap.enabled: Параметр для включения/отключения использования памяти вне кучи. spark.memory.offHeap.size: общий объем памяти в байтах для выделения вне кучи (из собственной памяти). Это не влияет на использование памяти кучи, также убедитесь, что не превышают общие ограничения ваших исполнителей.
Нужно ли мне вручную указывать объем памяти вне кучи для Tungsten? Да. Помимо включения памяти OffHeap, вам необходимо вручную установить ее размер, чтобы использовать память Off-Heap для приложений Spark. Обратите внимание, что модель памяти вне кучи включает в себя только память хранения и память выполнения.
Изображение ниже представляет собой абстрактную концепцию, когда память вне кучи работает.
• Если память вне кучи включена, в Executor будет присутствовать как память "в куче", так и память "вне кучи".
• Память хранилища Исполнителя = Память хранилища в куче + Память хранилища вне памяти
• Память выполнения Executor = память выполнения On-Heap + память выполнения Off-Heap