У меня Spark 2.1.0 работает на кластере с N подчиненных узлов. Каждый узел имеет 16 ядер (8 ядер/процессор и 2 процессора) и 1 графический процессор. Я хочу использовать процесс карты для запуска ядра GPU. Поскольку на каждый узел имеется только 1 графический процессор, мне нужно убедиться, что два исполнителя не находятся на одном и том же узле (в то же время), пытаясь использовать графический процессор, и что две задачи не передаются одному и тому же исполнителю одновременно.Искра с графическими процессорами: как заставить 1 задачу на исполнителя
Как я могу заставить Spark иметь одного исполнителя на узел?
Я попытался следующие:
--Setting: spark.executor.cores 16
в $SPARK_HOME/conf/spark-defaults.conf
--Setting: SPARK_WORKER_CORES = 16
и SPARK_WORKER_INSTANCES = 1
в $SPARK_HOME/conf/spark-env.sh
и
--Setting conf = SparkConf().set('spark.executor.cores', 16).set('spark.executor.instances', 6)
напрямую в моем искровом сценарии (когда я хотел N = 6 для дебюта ugging).
Эти параметры создают 6 исполнителей на разных узлах по желанию, но, похоже, каждая задача назначается одному и тому же исполнителю.
Вот некоторые фрагменты из моего самого последнего выпуска (который заставляет меня думать, что он должен работать, как я хочу).
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor added: app-20170217110910-0000/0 on worker-20170217110853-10.128.14.208-35771 (10.128.14.208:35771) with 16 cores
17/02/17 11:09:10 INFO StandaloneSchedulerBackend: Granted executor ID app-20170217110910-0000/0 on hostPort 10.128.14.208:35771 with 16 cores, 16.0 GB RAM
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor added: app-20170217110910-0000/1 on worker-20170217110853-10.128.9.95-59294 (10.128.9.95:59294) with 16 cores
17/02/17 11:09:10 INFO StandaloneSchedulerBackend: Granted executor ID app-20170217110910-0000/1 on hostPort 10.128.9.95:59294 with 16 cores, 16.0 GB RAM
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor added: app-20170217110910-0000/2 on worker-20170217110853-10.128.3.71-47507 (10.128.3.71:47507) with 16 cores
17/02/17 11:09:10 INFO StandaloneSchedulerBackend: Granted executor ID app-20170217110910-0000/2 on hostPort 10.128.3.71:47507 with 16 cores, 16.0 GB RAM
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor added: app-20170217110910-0000/3 on worker-20170217110853-10.128.9.96-50800 (10.128.9.96:50800) with 16 cores
17/02/17 11:09:10 INFO StandaloneSchedulerBackend: Granted executor ID app-20170217110910-0000/3 on hostPort 10.128.9.96:50800 with 16 cores, 16.0 GB RAM
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor added: app-20170217110910-0000/4 on worker-20170217110853-10.128.3.73-60194 (10.128.3.73:60194) with 16 cores
17/02/17 11:09:10 INFO StandaloneSchedulerBackend: Granted executor ID app-20170217110910-0000/4 on hostPort 10.128.3.73:60194 with 16 cores, 16.0 GB RAM
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor added: app-20170217110910-0000/5 on worker-20170217110853-10.128.3.74-42793 (10.128.3.74:42793) with 16 cores
17/02/17 11:09:10 INFO StandaloneSchedulerBackend: Granted executor ID app-20170217110910-0000/5 on hostPort 10.128.3.74:42793 with 16 cores, 16.0 GB RAM
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20170217110910-0000/1 is now RUNNING
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20170217110910-0000/3 is now RUNNING
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20170217110910-0000/4 is now RUNNING
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20170217110910-0000/2 is now RUNNING
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20170217110910-0000/0 is now RUNNING
17/02/17 11:09:10 INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20170217110910-0000/5 is now RUNNING
17/02/17 11:09:11 INFO StandaloneSchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0
My RDD has 6 partitions.
Важно то, что было начато 6 Исполнителями, каждый с другим IP-адресом и каждого получать 16 ядер (именно то, что я ожидал). Фраза My RDD has 6 partitions.
является оператором печати из моего кода после перераспределения моего RDD (чтобы убедиться, что у меня есть 1 раздел на каждого исполнителя).
Затем ЭТО происходит ... каждый из 6 заданий отправляется одному и тому же исполнителю!
17/02/17 11:09:12 INFO TaskSchedulerImpl: Adding task set 0.0 with 6 tasks
17/02/17 11:09:17 INFO CoarseGrainedSchedulerBackend$DriverEndpoint: Registered executor NettyRpcEndpointRef(null) (10.128.9.95:34059) with ID 1
17/02/17 11:09:17 INFO TaskSetManager: Starting task 0.0 in stage 0.0 (TID 0, 10.128.9.95, executor 1, partition 0, PROCESS_LOCAL, 6095 bytes)
17/02/17 11:09:17 INFO TaskSetManager: Starting task 1.0 in stage 0.0 (TID 1, 10.128.9.95, executor 1, partition 1, PROCESS_LOCAL, 6095 bytes)
17/02/17 11:09:17 INFO TaskSetManager: Starting task 2.0 in stage 0.0 (TID 2, 10.128.9.95, executor 1, partition 2, PROCESS_LOCAL, 6095 bytes)
17/02/17 11:09:17 INFO TaskSetManager: Starting task 3.0 in stage 0.0 (TID 3, 10.128.9.95, executor 1, partition 3, PROCESS_LOCAL, 6095 bytes)
17/02/17 11:09:17 INFO TaskSetManager: Starting task 4.0 in stage 0.0 (TID 4, 10.128.9.95, executor 1, partition 4, PROCESS_LOCAL, 6095 bytes)
17/02/17 11:09:17 INFO TaskSetManager: Starting task 5.0 in stage 0.0 (TID 5, 10.128.9.95, executor 1, partition 5, PROCESS_LOCAL, 6095 bytes)
Почему? и Как это исправить? Проблема в том, что на данный момент все 6 задач конкурируют за один и тот же GPU, и GPU не может использоваться совместно.
Оглядываясь назад, возможно, то, что я действительно хочу, - это 1 задача (за раз) на узел. Мне все равно, как я достигаю цели. Для каждой задачи требуется выделенный графический процессор ... – TravisJ
IMHO вы не фокусируетесь на реальной проблеме, а ваши * разделы * не отправляются исполнителям круговым способом. Посмотрите на https://github.com/apache/spark/pull/8280, чтобы понять, что вы могли бы попробовать, например, 'spark.shuffle.reduceLocality.enabled = false' и/или все другие свойства' locality' в https: //spark.apache.org/docs/latest/configuration.html#scheduling –