Как передать аргументы в spark-submit с помощью docker

#scala #docker #apache-spark

#scala #docker #apache-spark

Вопрос:

На моем ноутбуке запущен контейнер docker с ведущим и тремя рабочими, я могу запустить типичный пример wordcount, введя IP-адрес ведущего с помощью команды, подобной этой:

 bash-4.3# spark/bin/spark-submit --class com.oreilly.learningsparkexamples.mini.scala.WordCount --master spark://spark-master:7077 /opt/spark-apps/learning-spark-mini-example_2.11-0.0.1.jar /opt/spark-data/README.md /opt/spark-data/output-5
  

Я вижу, как файлы были сгенерированы внутри output-5

но когда я пытаюсь запустить процесс извне, используя команду:

 docker run --network docker-spark-cluster_spark-network -v /tmp/spark-apps:/opt/spark-apps --env SPARK_APPLICATION_JAR_LOCATION=$SPARK_APPLICATION_JAR_LOCATION --env SPARK_APPLICATION_MAIN_CLASS=$SPARK_APPLICATION_MAIN_CLASS -e APP_ARGS="/opt/spark-data/README.md /opt/spark-data/output-5" spark-submit:2.4.0
  

Где

 echo $SPARK_APPLICATION_JAR_LOCATION
/opt/spark-apps/learning-spark-mini-example_2.11-0.0.1.jar

echo $SPARK_APPLICATION_MAIN_CLASS
com.oreilly.learningsparkexamples.mini.scala.WordCount
  

И когда я захожу на страницу worker, где выполняется попытка выполнения задачи, я вижу, что в строке 11, первой из всех, где собирается путь для первого аргумента, у меня появляется ошибка, подобная этой:

 Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
    at com.oreilly.learningsparkexamples.mini.scala.WordCount$.main(WordCount.scala:11)
  

Понятно, что в нулевой позиции не собирается путь к первому параметру, к тому входному файлу, из которого я хочу сделать wordcount.

Вопрос в том, почему docker не использует аргументы, переданные через -e APP_ARGS=»/opt/spark-data/README.md /opt/spark-data-output-5″?

Я уже пытался запустить задание традиционным способом, войдя в драйвер spark-master и запустив команду spark-submit, но когда я пытаюсь запустить задачу с помощью docker, это не работает.

Это должно быть тривиально, но у меня все еще есть какая-то подсказка. Кто-нибудь может мне помочь?

РЕШАЕМАЯ

Я должен использовать команду, подобную этой:

 docker run --network docker-spark-cluster_spark-network -v /tmp/spark-apps:/opt/spark-apps --env SPARK_APPLICATION_JAR_LOCATION=$SPARK_APPLICATION_JAR_LOCATION --env SPARK_APPLICATION_MAIN_CLASS=$SPARK_APPLICATION_MAIN_CLASS --env SPARK_APPLICATION_ARGS="/opt/spark-data/README.md /opt/spark-data/output-6" spark-submit:2.4.0
  

Возобновляя, мне пришлось изменить -e APP_ARGS на -env SPARK_APPLICATION_ARGS

-e APP_ARGS — это предлагаемый способ docker…

Ответ №1:

Это команда, которая решает мою проблему:

 docker run --network docker-spark-cluster_spark-network -v /tmp/spark-apps:/opt/spark-apps --env SPARK_APPLICATION_JAR_LOCATION=$SPARK_APPLICATION_JAR_LOCATION --env SPARK_APPLICATION_MAIN_CLASS=$SPARK_APPLICATION_MAIN_CLASS --env SPARK_APPLICATION_ARGS="/opt/spark-data/README.md /opt/spark-data/output-6" spark-submit:2.4.0
  

Я должен использовать —env SPARK_APPLICATION_ARGS=»args1 args2 argsN» вместо -e APP_ARGS=»args1 args2 argsN».