如何使用Docker将参数传递给Spark-Submit

时间:2019-03-19 13:46:09

标签: scala docker apache-spark

我的笔记本电脑上有一个docker容器,其中有一个master和三个工人,我可以使用以下命令输入master的ip来启动典型的wordcount示例:

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

当我进入尝试执行任务的工作人员页面时,我可以看到在第11行中,首先是收集第一个参数的路径的地方,我遇到了这样的错误:

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

很明显,在零位置不收集第一个参数的路径,第一个参数是我要对其进行单词计数的输入文件。

问题是,为什么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 个答案:

答案 0 :(得分: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”。