Понимание распределения ресурсов для рабочих заданий на мезо
Я работаю над проектом в Spark и недавно переключился с использования Spark Standalone на Mesos для управления кластером. Теперь я не понимаю, как распределять ресурсы при отправке работы в новой системе.
В автономном режиме я использовал что-то вроде этого (следуя некоторым рекомендациямэто сообщение в блоге Cloudera:
/opt/spark/bin/spark-submit --executor-memory 16G --executor-cores 8
--total-executor-cores 240 myscript.py
Это кластер, в котором каждая машина имеет 16 ядер и ~ 32 ГБ оперативной памяти.
Что было приятно в этом, так это то, что я хорошо контролировал количество исполнителей и ресурсы, выделенные каждому. В приведенном выше примере я знал, что получаю 240/8 = 30 исполнителей, каждый с 16 ГБ памяти и 8 ядрами. Учитывая память на каждой машине в кластере, это будет составлять не более двух исполнителей, работающих на каждой машине. Если бы я хотел больше исполнителей, я мог бы сделать что-то вроде
/opt/spark/bin/spark-submit --executor-memory 10G --executor-cores 5
--total-executor-cores 240 myscript.py
Теперь это даст мне 240/5 = 47 исполнителей, каждый с 5 ядрами и 10 ГБ памяти, и позволит использовать до 3 исполнителей на машину.
Но теперь, когда я нахожусь на mesos, я немного запутался. Во-первых, я работаю в грубом режиме, чтобы гарантировать, что я могу исправить и контролировать свое распределение ресурсов (это в сервисе довольно сложной модели, где мы хотим предварительно распределить ресурсы).
Теперь я могу указать--total-executor-cores
а также--executor-memory
, но документация говорит мне, что--exeuctor-cores
применяется только к Spark standalone и YARN, что затрудняет указание общего количества исполнителей и ресурсов, выделенных каждому. Скажи, что я запускаю это:
/opt/spark/bin/spark-submit --total-executor-cores 240 --executor-memory 16G --conf spark.mesos.coarse=true myscript.py
Когда я рассматриваю эту работу в веб-интерфейсе Mesos, все становится запутанным. Итак, вот мои вопросы:
Терминология. В веб-интерфейсе перечислены «рамки», которые, как я полагаю, соответствуют «заданиям» в автономном интерфейсе. Но когда я нажимаю на детали для определенного каркаса, он перечисляет «задачи». Но это не могут быть настоящие задачи Spark, верно? Насколько я могу судить, «задача» здесь должна означать «исполнитель», если говорить о Спарк. Это согласуется с пользовательским интерфейсом, который говорит, что моя структура (задание) имеет: 15 активных задач, 240 процессоров и 264 ГБ памяти.
264/15 = 17,6, что, по-видимому, согласуется с 16 ГБ памяти на каждого исполнителя, которого я указал (плюс некоторые накладные расходы, я думаю). Правильно ли я понимаю, как я все это интерпретирую?
Предполагая, что да, когда я проверяю любую из этих «задач» (исполнителей), я вижу, что каждому назначено 16 ядер. Учитывая, что у нас есть 16 ядер на машину, это, похоже, указывает на то, что я в основном работаю по одному исполнителю на каждой из 16 машин, и что каждый исполнитель получает полные 16 ядер, но только 16 ГБ оперативной памяти. (обратите внимание, что даже если я уронить--executor-memory
Кстати, до 4 ГБ, mesos все еще просто запускает одного исполнителя на узел (16 ядер и 4 ГБ ОЗУ). Но я хочу сделать что-то вроде моих первых двух примеров. То есть я хочу запустить несколько исполнителей для каждого узла, каждый из которых использует ОЗУ и ядра этого узла (т.е. умеренное количество ядер перед исполнителем, 5-8). Учитывая, что я не могу указать--executor-cores
в Месосе, как мне это сделать? Или я по какой-то причине ухожу из базы, даже желая достичь этого? Разве Mesos просто не разрешит множественные exeuctors на узел?