Spark Standalone, как передать локальный файл .jar в кластер

У меня есть кластер с двумя рабочими и одним мастером. Чтобы запустить мастер и рабочие, я использую sbin/start-master.sh и sbin/start-slaves.shна главной машине. Затем главный пользовательский интерфейс показывает мне, что ведомые устройства ЖИВЫ (так что пока все в порядке). Проблема возникает, когда я хочу использовать spark-submit.

Я выполняю эту команду на своем локальном компьютере:

spark-submit --master spark://<master-ip>:7077 --deploy-mode cluster /home/user/example.jar

Но выскакивает следующая ошибка: ERROR ClientEndpoint: Exception from cluster was: java.nio.file.NoSuchFileException: /home/user/example.jar

Я провел некоторое исследование переполнения стека и документации Spark, и кажется, что я должен указать команду application-jar of spark-submit как «Путь к связанному банку, включая ваше приложение и все зависимости. URL-адрес должен быть глобально виден внутри вашего кластера, для Например, путь hdfs:// или путь file://, присутствующий на всех узлах». (как указано https://spark.apache.org/docs/latest/submitting-applications.html).

Мой вопрос: как я могу сделать свой .jar видимым глобально внутри кластера? Здесь есть аналогичный вопрос Автономный кластер Spark не может прочитать файлы в локальной файловой системе, но решения не работают для меня.

Кроме того, я делаю что-то неправильно, инициализируя кластер внутри моей основной машины с помощью sbin/start-master.sh, но затем выполняя spark-submit на моей локальной машине? Я инициализирую мастер в терминале своего мастера, потому что я читал об этом в документации Spark, но, возможно, это как-то связано с проблемой. Из документации Spark:

Once you’ve set up this file, you can launch or stop your cluster with the following shell scripts, based on Hadoop’s deploy scripts, and available in SPARK_HOME/sbin: [...] Note that these scripts must be executed on the machine you want to run the Spark master on, not your local machine.

Большое тебе спасибо

EDIT: я скопировал файл .jar в каждый воркер, и он работает. Но я хочу знать, есть ли лучший способ, поскольку этот метод заставляет меня копировать .jar каждому рабочему процессу каждый раз, когда я создаю новую банку. (Это был один из ответов на вопрос уже размещенной ссылки Автономный кластер Spark не может прочитать файлы в локальной файловой системе )


person meisan    schedule 13.03.2020    source источник
comment
Вы пытались указать, где найти файл jar с --jars example.jar при запуске spark-submit?   -  person Oli    schedule 13.03.2020
comment
Привет Оли, спасибо за ответ! Как бы вы это сделали? Если я использую --jars example.jar после всей команды, которую я написал выше, она все равно выдает ту же ошибку (NoSuchFileException). В то время как если я не укажу указанный выше путь и напишу вместо него --jars example.jar или --jars /home/user/example.jar, это выдаст мне ошибку: Missing application resource.   -  person meisan    schedule 13.03.2020
comment
попробуйте указать параметр --class следующим образом: spark-submit --master spark://‹master-ip›:7077 --deploy-mode cluster --jars /home/user/example.jar -- class ‹имя-вашего-основного-класса›   -  person sarath kumar    schedule 14.03.2020
comment
Привет Сарат! Спасибо за Ваш ответ. Я попробовал, и spark-submit выдает ошибку Missing application resource. (и предлагает варианты, доступные с spark-submit)   -  person meisan    schedule 16.03.2020


Ответы (1)


@meisan ваша команда spark-submit упускает из виду 2 вещи.

  • ваши банки должны быть добавлены с флагом --jar
  • файл, содержащий код вашего драйвера, то есть основную функцию.

Теперь вы нигде не указали, используете ли вы scala или python, но в двух словах ваша команда будет выглядеть примерно так:

для питона:

spark-submit --master spark://<master>:7077 --deploy-mode cluster --jar <dependency-jars> <python-file-holding-driver-logic>

для scala:

spark-submit --master spark://<master>:7077 --deploy-mode cluster --class <scala-driver-class> --driver-class-path <application-jar> --jar <dependency-jars>

Кроме того, spark позаботится об отправке необходимых файлов и jar-файлов исполнителям, когда вы используете задокументированные флаги. Если вы хотите опустить флаг --driver-class-path, вы можете установить переменную окружения SPARK_CLASSPATH на путь, по которому размещены все ваши банки.

person khari-sing    schedule 09.09.2020