2016-11-24 4 views
4

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

Чтобы решить эту проблему, я стараюсь следовать инструкциям от Spark 2.0 Documentation. Так, на мой $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: Successfully registered with master spark://cerberus:7077

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

INFO ExternalShuffleService: Starting shuffle service on port 7337 with useSasl = false 16/11/24 13:32:08 ERROR Inbox: Ignoring error java.net.BindException: Address already in use

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

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

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

ответ

1

У меня была такая же проблема, и мне показалось, что это работает, удалив элемент spark.shuffle.service.enabled из файла конфигурации (на самом деле у меня нет никаких элементов, связанных с динамикой), и вместо этого поставьте это в 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 

Затем я начал использовать два ноутбука с этим контекстом и получил их обоих, чтобы выполнить небольшую работу. Приложение первого ноутбука выполняет эту работу и находится в состоянии RUNNING, приложение второго ноутбука находится в состоянии WAITING. Через минуту (время ожидания простоя по умолчанию) ресурсы перераспределяются, а второй контекст получает свою работу (и оба находятся в состоянии RUNNING).

Надеюсь, что это поможет, John