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