为什么我无法使用spark-submit覆盖num-executors选项?

时间:2017-10-20 04:37:10

标签: apache-spark yarn

我试图通过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的工作方式

2 个答案:

答案 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
  

属性优先顺序(前一个更多)

     
      
  1. 直接在SparkConf(代码中)设置的属性最高   优先级。
  2.   
  3. 将传递在属性文件中指定为标志或的任何值   应用程序和合并与通过指定的那些   的 SparkConf 即可。
  4.   
  5. 然后将标记传递给spark-submitspark-shell,例如--master
  6.   
  7. 然后spark-defaults.conf文件中的选项。
  8.         

    自早期版本的Spark以来,已重命名了一些配置键;在这种情况下,旧的密钥名称仍然被接受,但优先级低于新密钥的任何实例。

来源:Dynamically Loading Spark Properties

答案 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启动应用程序时已经在启动时分配了主服务器,所以为时已晚。这正是您不应在代码中指定特定于部署环境的属性的原因:

  1. 它可能并不总是有效(见主人的情况)
  2. 它要求每次配置更改都需要重新编译代码(并使其有点笨拙)
  3. 这就是为什么你应该总是使用spark-submit来提交你的Spark应用程序(除非你有理由不这样做,但是你知道为什么并且可以轻松地解释它。)