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 с другой машины в сети, возможно, также запуск самого ведомого устройства.
вещи, которые я пробовал:
- не настраивать SPARK_LOCAL_IP вообще, ведомый привязывается к ip-адресу контейнера (например, 172.17.0.45), не может быть подключен к от мастера или драйвера, вычисление по-прежнему работает большую часть времени, но не всегда
- привязка к 0.0.0.0, рабы разговаривают с хозяином и устанавливают некоторую связь, но она умирает, появляется другой раб и уходит, они продолжают петлять, как это
- привязка к 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 / хост-ОС):
- использовать
--net host
сdocker run
=> eth0 хоста отображается в контейнере - 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.