Количество процессоров на задание в Spark

Я не совсем понимаю параметр spark.task.cpus. Мне кажется, что "задача" соответствует "потоку" или "процессу", если хотите, внутри исполнителя. Предположим, что я установил "spark.task.cpus" в 2.

  • Как поток может использовать два процессора одновременно? Не могли ли потребовать блокировки и вызвать проблемы синхронизации?

  • Я смотрю на функцию launchTask() в deploy/executor/Executor.scala, и я не вижу понятия "количество процессоров для каждой задачи" здесь. Итак, где/как Spark в конечном итоге выделяет более одного процессора для задачи в автономном режиме?

Ответ 1

Насколько я знаю, spark.task.cpus управляет parallelism задачами в вашем кластере в случае, когда некоторые определенные задачи имеют собственный внутренний (пользовательский) parallelism.

Подробнее: Мы знаем, что spark.cores.max определяет, сколько потоков (aka core) требуется вашему приложению. Если вы оставите spark.task.cpus = 1, тогда вы будете иметь # spark.cores.max количество одновременных задач Spark, запущенных одновременно.

Вам нужно только изменить spark.task.cpus, если вы знаете, что ваши задачи сами распараллеливаются (возможно, каждая ваша задача порождает два потока, взаимодействует с внешними инструментами и т.д.). Установив spark.task.cpus соответственно, вы станете хорошим "гражданин". Теперь, если у вас есть spark.cores.max = 10 и spark.task.cpus = 2 Spark будет создавать только 10/2 = 5 одновременных задач. Учитывая, что ваши задачи требуют (скажем) 2 потока внутри, общее количество выполняемых потоков никогда не будет больше 10. Это означает, что вы никогда не переходите от своего первоначального контракта (определяется spark.cores.max).