Ответ 1
Spark/Tungsten используют кодеры/декодеры для представления объектов JVM в качестве узкоспециализированных объектов Spark SQL Types, которые затем могут быть сериализованы и управляться высокоэффективным способом. Представление внутреннего формата является высокоэффективным и удобным для использования памяти GC.
Таким образом, даже работая в режиме по умолчанию в режиме кучи, Tungsten устраняет большие накладные расходы на размещение памяти объектов JVM и время работы GC. Вольфрам в этом режиме выделяет объекты в куче для своих внутренних целей, а куски памяти выделения могут быть огромными, но это происходит гораздо реже и выживает переходы GC поколения. Это почти исключает необходимость рассматривать перемещение этой внутренней структуры с кучи.
В наших экспериментах с этим режимом включения и выключения мы не видели значительных улучшений времени выполнения. Но то, что вы получаете с выключенным режимом работы, - это то, что нужно тщательно сконструировать выделение памяти вне вашего процесса JVM. Это может наложить некоторые трудности в менеджерах контейнеров, таких как YARN, Mesos и т.д., Когда вам нужно будет разрешить и планировать дополнительные куски памяти, помимо вашей конфигурации процесса JVM.
Также в режиме без кучи Tungsten использует sun.misc.Unsafe, который может быть нежелательным или даже возможным в ваших сценариях развертывания (например, с ограничительной конфигурацией менеджера безопасности java).
Я также передаю видеозапись от Джоша Розена, когда ему задают аналогичный вопрос.