2017-02-17 16 views
0

У меня 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 не может использоваться совместно.

+0

Оглядываясь назад, возможно, то, что я действительно хочу, - это 1 задача (за раз) на узел. Мне все равно, как я достигаю цели. Для каждой задачи требуется выделенный графический процессор ... – TravisJ

+1

IMHO вы не фокусируетесь на реальной проблеме, а ваши * разделы * не отправляются исполнителям круговым способом. Посмотрите на https://github.com/apache/spark/pull/8280, чтобы понять, что вы могли бы попробовать, например, 'spark.shuffle.reduceLocality.enabled = false' и/или все другие свойства' locality' в https: //spark.apache.org/docs/latest/configuration.html#scheduling –

ответ

0

Я попробовал предложение в комментариях Самсона Шарфрихтера, но они, похоже, не работали. Однако я нашел: http://spark.apache.org/docs/latest/configuration.html#scheduling который включает spark.task.cpus. Если я установил это на 16 и spark.executor.cores на 16, то я, кажется, получаю одну задачу, назначенную каждому исполнителю.

+0

, должно быть достаточно сказать «spark.executor.cores = 16», чтобы требовать только одного исполнителя на каждом хосте, если все хосты имеют 16 ядер – grisaitis