Spark SPARK PUBLIC DNS и SPARK LOCAL IP на автономном кластере с контейнерами docker

до сих пор я запускал Spark только на машинах Linux и VMs (Мостовая сеть), но теперь мне интересно использовать больше компьютеров в качестве рабов. Было бы удобно распространять контейнер Spark Slave Docker на компьютерах и автоматически подключать их к жестко закодированному IP-адресу Spark master. Это уже работает, но у меня возникли проблемы с настройкой правильного параметра SPARK_LOCAL_IP (или --host для start-slave.sh) на невольничьих контейнерах.

думаю, я правильно настроил переменную spark_public_dns env в соответствии с IP-адресом, доступным для сети хост-компьютера (от 10.0.X. X адресное пространство), по крайней мере, он показан на Spark master web UI и доступен на всех машинах.

Я также установил SPARK_WORKER_OPTS и порт Docker вперед, как указано в http://sometechshit.blogspot.ru/2015/04/running-spark-standalone-cluster-in.html, но в моем случае Spark master работает на другой машине, а не внутри Docker. Я запуск заданий Spark с другой машины в сети, возможно, также запуск самого ведомого устройства.

вещи, которые я пробовал:

  1. не настраивать SPARK_LOCAL_IP вообще, ведомый привязывается к ip-адресу контейнера (например, 172.17.0.45), не может быть подключен к от мастера или драйвера, вычисление по-прежнему работает большую часть времени, но не всегда
  2. привязка к 0.0.0.0, рабы разговаривают с хозяином и устанавливают некоторую связь, но она умирает, появляется другой раб и уходит, они продолжают петлять, как это
  3. привязка к ip-адресу хоста, запуск не выполняется, поскольку этот ip-адрес не отображается в контейнере, но будет доступен другим, поскольку настроена переадресация портов

интересно, почему при подключении к рабам не используется настроенный SPARK_PUBLIC_DNS? Я думал, что SPARK_LOCAL_IP будет влиять только на локальную привязку, но не будет отображаться на внешних компьютерах.

At https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/troubleshooting/connectivity_issues.html они инструктируют "установить SPARK_LOCAL_IP в имя хоста, адресуемое кластеру для драйверов, основных и рабочих процессов", это единственный вариант? Я бы избегал дополнительной конфигурации DNS и просто использовал ips для настройки трафика между компьютерами. Или есть простой способ достичь этого?

Edit: Подводя итоги текущей настройка:

  • Master работает на Linux (VM в VirtualBox на Windows с мостовой сетью)
  • драйвер отправляет задания с другой машины Windows, отлично работает
  • изображение Докера для запуска рабов распространяется как "сохраненный".смола.файл gz, загруженный (curl xyz / gunzip / docker load) и запущенный на других машинах в сети, имеет этот probem с частной/публичной конфигурацией ip

3 ответов


я запускаю 3 разных типа контейнеров docker на своей машине с намерением развернуть их в облаке, когда к ним добавляется все необходимое программное обеспечение: Master, Worker и Jupyter notebook (с ядрами Scala, R и Python).

вот мои наблюдения:

Магистр:

  • я не мог привязать его к IP-адресу Хоста Docker. Вместо этого я передаю ему составленное доменное имя:-h "dockerhost-master" -e SPARK_MASTER_IP="dockerhost-master". Я не мог найти ... способ привязки Akka к IP-адресу контейнера и приема сообщений к IP-адресу хоста. Я знаю, что это возможно с Akka 2.4, но, возможно, не с Spark.
  • я прохожу мимо -e SPARK_LOCAL_IP="${HOST_IP}" что заставляет веб-интерфейс связываться с этим адресом вместо IP-адреса контейнера, но веб-интерфейс работает в любом случае.

сотрудник:

  • я дал рабочему контейнеру другое имя хоста и передал его как --host СПАРК org.apache.spark.deploy.master.Worker класса. Это не может быть то же самое, что мастер или кластер Akka не будет работать:-h "dockerhost-worker"
  • я использую Докер это add-host таким образом, контейнер может разрешить имя хоста IP-адресу мастера:--add-host dockerhost-master:${HOST_IP}
  • главный URL, который должен быть передан spark://dockerhost-master:7077

Jupyter:

  • этому нужен главный URL и add-host чтобы иметь возможность решить его
  • на SparkContext живет в блокнот и именно там запускается веб-интерфейс приложения Spark, а не мастер. По умолчанию он привязывается к внутреннему IP-адресу контейнера Docker. Чтобы изменить это, я должен был пройти:-e SPARK_PUBLIC_DNS="${VM_IP}" -p 4040:4040. Последующие заявки из записной книжки будут на 4041, 4042 и т. д.

С этими настройками три компонента могут взаимодействовать друг с другом. Я использую пользовательские сценарии запуска с spark-class для запуска классов на переднем плане и сохранения контейнеров Docker с момента увольнения.

есть несколько других портов, которые могут быть открыты, например, сервер истории, с которым я еще не сталкивался. Используя --net host кажется намного проще.


Я думаю, что нашел решение для моего прецедента (один контейнер Spark / хост-ОС):

  1. использовать --net host с docker run => eth0 хоста отображается в контейнере
  2. Set SPARK_PUBLIC_DNS и SPARK_LOCAL_IP для ip хоста игнорируйте 172 docker0.х.х.адрес X

Spark может привязываться к ip-адресу хоста, и другие машины также связываются с ним, переадресация портов заботится об остальном. DNS или какие-либо сложные конфигурации не были нужны, я не тщательно протестировал но пока все хорошо.

Edit: обратите внимание, что эти инструкции предназначены для Spark 1.x, на Искре 2.x только SPARK_PUBLIC_DNS требуется, я думаю SPARK_LOCAL_IP - Это исключено.


Я также запускаю spark в контейнерах на разных хостах docker. Запуск рабочего контейнера с этими аргументами работал для меня:

docker run \
-e SPARK_WORKER_PORT=6066 \
-p 6066:6066 \
-p 8081:8081 \
--hostname $PUBLIC_HOSTNAME \
-e SPARK_LOCAL_HOSTNAME=$PUBLIC_HOSTNAME \
-e SPARK_IDENT_STRING=$PUBLIC_HOSTNAME \
-e SPARK_PUBLIC_DNS=$PUBLIC_IP \
spark ...

здесь $PUBLIC_HOSTNAME - имя хоста, доступное от мастера.

недостающая часть была SPARK_LOCAL_HOSTNAME, недокументированный вариант AFAICT.

https://github.com/apache/spark/blob/v2.1.0/core/src/main/scala/org/apache/spark/util/Utils.scala#L904