Автономный режим Spark 2.0, ошибка запуска рабочего процесса динамического выделения ресурсов

Я запускаю Spark 2.0 в автономном режиме, успешно настроил его для запуска на сервере, а также смог настроить Ipython Kernel PySpark в качестве опции в Jupyter Notebook. Все работает нормально, но я сталкиваюсь с проблемой, заключающейся в том, что для каждого запускаемого мной ноутбука все мои 4 рабочих процесса назначаются этому приложению. Поэтому, если другой человек из моей команды попытается запустить другой блокнот с ядром PySpark, он просто не будет работать, пока я не остановлю первый блокнот и не отпущу всех рабочих.

Чтобы решить эту проблему, я пытаюсь следовать инструкциям из Документация по Spark 2.0. Итак, на моем $SPARK_HOME/conf/spark-defaults.conf у меня есть следующие строчки:

spark.dynamicAllocation.enabled    true
spark.shuffle.service.enabled      true
spark.dynamicAllocation.executorIdleTimeout    10

Также на $SPARK_HOME/conf/spark-env.sh у меня есть:

export SPARK_WORKER_MEMORY=1g
export SPARK_EXECUTOR_MEMORY=512m
export SPARK_WORKER_INSTANCES=4
export SPARK_WORKER_CORES=1

Но когда я пытаюсь запустить воркеры, используя $SPARK_HOME/sbin/start-slaves.sh, успешно запускается только первый воркер. Журнал первого воркера выглядит так:

16/11/24 13:32:06 INFO Worker: Успешно зарегистрирован на master spark: // cerberus: 7077

Но журнал рабочих 2-4 показывает мне эту ошибку:

INFO ExternalShuffleService: запуск службы перемешивания на порте 7337 с useSasl = false 16/11/24 13:32:08 ERROR Inbox: игнорирование ошибки java.net.BindException: адрес уже используется

Мне кажется, что первый воркер успешно запускает сервис shuffle на порту 7337, но рабочие 2-4 «не знают» об этом и пытаются запустить другой сервис shuffle на том же порту.

Проблема возникает также для всех воркеров (1-4), если я сначала запускаю службу перемешивания (используя $SPARK_HOME/sbin/start-shuffle-service.sh), а затем пытаюсь запустить всех воркеров ($SPARK_HOME/sbin/start-slaves.sh).

Есть ли возможность обойти это? Чтобы все рабочие могли проверить, запущена ли служба перемешивания, и подключиться к ней вместо попытки создать новую службу?


person Eilliar    schedule 24.11.2016    source источник


Ответы (1)


У меня была такая же проблема, и, похоже, она заработала, удалив элемент spark.shuffle.service.enabled из файла конфигурации (на самом деле у меня нет никаких элементов, связанных с dynamicAllocation), и вместо этого поместил это в SparkConf, когда Я запрашиваю SparkContext:

sconf = pyspark.SparkConf() \
    .setAppName("sc1") \
    .set("spark.dynamicAllocation.enabled", "true") \
    .set("spark.shuffle.service.enabled", "true")
sc1 = pyspark.SparkContext(conf=sconf)

Я запускаю ведущее и ведомое устройства как обычно:

$SPARK_HOME/sbin/start-all.sh

И мне нужно запустить один экземпляр службы перетасовки:

$SPARK_HOME/sbin/start-shuffle-service.sh

Затем я запустил две записные книжки с этим контекстом и заставил их сделать небольшую работу. Приложение первой записной книжки выполняет работу и находится в состоянии РАБОТАЕТ, приложение второй записной книжки находится в состоянии ОЖИДАНИЕ. Через минуту (тайм-аут простоя по умолчанию) ресурсы перераспределяются, и второй контекст выполняет свою работу (и оба находятся в состоянии РАБОТА).

Надеюсь, это поможет, Джон

person John Leonard    schedule 12.05.2017