Как работать с памятью исполнителей и памятью драйвера в Spark?
Я запутался в работе с памятью исполнителей и памятью драйвера в Spark.
Настройки моей среды следующие:
- Память 128 G, 16 CPU для 9 VM
- Centos
- Hadoop 2.5.0-cdh5.2.0
- Искра 1.1.0
Информация о входных данных:
- Файл данных 3,5 ГБ с HDFS
Для простой разработки я выполнил свой код Python в автономном режиме кластера (8 рабочих, 20 ядер, 45,3 Г памяти) с помощью spark-submit
. Теперь я хотел бы установить память исполнителей или память драйвера для настройки производительности.
Из документации Spark определение для памяти исполнителя
Объем памяти для каждого процесса-исполнителя в том же формате, что и строки памяти JVM (например, 512 м, 2 г).
Как насчет памяти драйвера?
Ответы
Ответ 1
Память, которую необходимо назначить драйверу, зависит от задания.
Если задание основано исключительно на преобразованиях и заканчивается на каком-то распределенном выходном действии, таком как rdd.saveAsTextFile, rdd.saveToCassandra,... тогда потребность в памяти драйвера будет очень низкой. Всего будет 100 МБ. Драйвер также отвечает за доставку файлов и сбор показателей, но не участвует в обработке данных.
Если задание требуется, чтобы водитель участвовал в вычислении, например, например. некоторый ML algo, который должен материализовать результаты и транслировать их на следующей итерации, тогда ваша работа будет зависеть от количества данных, проходящих через драйвер. Операции, такие как .collect
, .take
и takeSample
, доставляют данные в драйвер, и, следовательно, драйверу требуется достаточно памяти для распределения таких данных.
например. Если у вас есть rdd
3 ГБ в кластере и вызывается val myresultArray = rdd.collect
, вам понадобится 3 ГБ памяти в драйвере для хранения этих данных плюс дополнительная возможность для функций, упомянутых в первом абзаце.
Ответ 2
В приложении Spark драйвер отвечает за планирование задач, а Исполнитель отвечает за выполнение конкретных задач в вашей работе.
Если вы знакомы с MapReduce, ваши задачи по карте и задачи уменьшаются, все исполняются в Executor (в Spark они называются ShuffleMapTasks и ResultTasks), а также независимо от того, какой RDD вы хотите кэшировать, также в куче JVM-исполнителя и на диске.
Итак, я думаю, что несколько GBs будут в порядке для вашего драйвера.