Я запускаю 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
).
Есть ли возможность обойти это? Чтобы все рабочие могли проверить, запущена ли служба перемешивания, и подключиться к ней вместо попытки создать новую службу?