Драйвер автономного подключения Spark к работнику

Я пытаюсь разместить локально автономный кластер искры. У меня есть две разнородные машины, подключенные к локальной сети. Каждая часть архитектуры, перечисленная ниже, работает в докере. у меня следующая конфигурация

  • мастер на машине 1 (порт 7077 открыт)
  • рабочий на машине 1
  • водитель на машине 2

Я использую тестовое приложение, которое открывает файл и считает его строки. Приложение работает, когда файл реплицируется на всех воркерах и я использую SparkContext.readText()

Но когда файл присутствует только на рабочем, а я использую SparkContext.parallelize() для доступа к нему на рабочих, у меня есть следующий дисплей:

INFO StandaloneSchedulerBackend: Granted executor ID app-20180116210619-0007/4 on hostPort 172.17.0.3:6598 with 4 cores, 1024.0 MB RAM
INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20180116210619-0007/4 is now RUNNING
INFO StandaloneAppClient$ClientEndpoint: Executor updated: app-20180116210619-0007/4 is now EXITED (Command exited with code 1)
INFO StandaloneSchedulerBackend: Executor app-20180116210619-0007/4 removed: Command exited with code 1
INFO StandaloneAppClient$ClientEndpoint: Executor added: app-20180116210619-0007/5 on worker-20180116205132-172.17.0.3-6598 (172.17.0.3:6598) with 4 cores```

это продолжается снова и снова без фактического вычисления приложения.

Это работает, когда я ставлю драйвер на тот же компьютер, что и рабочий. Так что я предполагаю, что есть какое-то соединение, которое можно разрешить между этими двумя по сети. Знаете ли вы, как это сделать (какие порты открыть, какой адрес добавить в /etc/hosts...)


person matthiasbe    schedule 16.01.2018    source источник


Ответы (1)


TL;DR Убедитесь, что spark.driver.host:spark.driver.port доступен с каждого узла в кластере.

В общем, вы должны убедиться, что все узлы (как исполнители, так и главные) могут связаться с драйвером.

  • В кластерном режиме, когда драйвер работает на одном из исполнителей, это выполняется по умолчанию, пока для соединений не закрыты порты (см. ниже).
  • В клиентском режиме машина, на которой запущен драйвер, должна быть доступна из кластера. Это означает, что spark.driver.host должен разрешаться в общедоступный адрес.

В обоих случаях вы должны иметь в виду, что по умолчанию драйвер работает на произвольном порту. Можно использовать фиксированный, установив spark.driver.port. Очевидно, что это не очень хорошо работает, если вы хотите отправить несколько приложений одновременно.

Более того:

когда файл присутствует только на рабочем

не будет работать. Все входы должны быть доступны из драйвера, а также из каждого узла-исполнителя.

person zero323    schedule 16.01.2018
comment
Благодаря вашему ответу, я думаю, проблема связана со связью между док-контейнерами по сети. - person matthiasbe; 17.01.2018
comment
Наконец-то я запустил свои драйверы и рабочие докеры с опцией --net=host, и это сработало. Это только временное решение, так как оно не дает мне сетевой изоляции. Сейчас я изучаю докер, чтобы найти правильное решение. - person matthiasbe; 22.01.2018
comment
Привет, @user6910411. По какой-то причине, когда я запускаю sparkContext с моей локальной машины на удаленный искровой кластер, значением spark.driver.host является локальный IP-адрес моей машины, который, очевидно, недоступен с рабочего узла. Как это можно решить? - person nEO; 03.01.2020
comment
@nEO spark.driver.host (и необязательно spark.driver.bindAddress). - person user10938362; 04.01.2020