#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».