我试图通过spark-submit提交应用程序时覆盖num-executors
等火花属性,如下所示:
spark-submit --class WC.WordCount \
--num-executors 8 \
--executor-cores 5 \
--executor-memory 3584M \
...../<myjar>.jar \
/public/blahblahblah /user/blahblah
然而它运行的默认执行程序数为2.但是如果我添加
,我可以覆盖属性--master yarn
有人可以解释为什么会这样吗?有趣的是,在我的应用程序代码中,我将master设置为yarn-client:
val conf = new SparkConf()
.setAppName("wordcount")
.setMaster("yarn-client")
.set("spark.ui.port","56487")
val sc = new SparkContext(conf)
有人可以了解选项--master
的工作方式
答案 0 :(得分:5)
如果您想使用不同的母版或不同的内存量来运行相同的应用程序。 Spark允许您使用默认SparkConf
执行此操作。正如您提到SparkConf
的属性,那些应用程序的优先级最高,请检查结尾处的属性优先级。
示例:强>
val sc = new SparkContext(new SparkConf())
然后,您可以在运行时提供配置值:
./bin/spark-submit \
--name "My app" \
--deploy-mode "client" \
--conf spark.ui.port=56487 \
--conf spark.master=yarn \ #alternate to --master
--conf spark.executor.memory=4g \ #alternate to --executor-memory
--conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \
--class WC.WordCount \
/<myjar>.jar \
/public/blahblahblah \
/user/blahblah
属性优先顺序(前一个更多)
- 直接在
SparkConf
(代码中)设置的属性最高 优先级。- 将传递在属性文件中指定为标志或的任何值 应用程序和合并与通过指定的那些 的 SparkConf 即可。
- 然后将标记传递给
spark-submit
或spark-shell
,例如--master
等- 然后
醇>spark-defaults.conf
文件中的选项。自早期版本的Spark以来,已重命名了一些配置键;在这种情况下,旧的密钥名称仍然被接受,但优先级低于新密钥的任何实例。
答案 1 :(得分:3)
我试图通过spark-submit提交应用程序时覆盖诸如num-executors之类的spark属性,如下所示
它将不工作(除非您覆盖spark.master
文件中的conf/spark-defaults.conf
或类似内容,因此您不必在命令行中明确指定它。)
原因是默认的Spark master是local[*]
,执行器的数量正好是一个,即驱动程序。那就是本地部署环境。请参阅Master URLs。
事实上,正如您在帮助中看到的那样,num-executors
非常依赖YARN:
$ ./bin/spark-submit --help
...
YARN-only:
--num-executors NUM Number of executors to launch (Default: 2).
If dynamic allocation is enabled, the initial number of
executors will be at least NUM.
这解释了为什么当你切换到YARN时它起作用了。它应该与YARN一起工作(无论部署模式如何,即客户端或集群仅仅是驱动程序而不是执行程序)。
您可能想知道为什么它不适用于您的代码中定义的主服务器。原因是,由于使用spark-submit启动应用程序时已经在启动时分配了主服务器,所以为时已晚。这正是您不应在代码中指定特定于部署环境的属性的原因:
这就是为什么你应该总是使用spark-submit
来提交你的Spark应用程序(除非你有理由不这样做,但是你知道为什么并且可以轻松地解释它。)