为什么 Spark 提交脚本 spark-submit 会忽略 `--num-executors`?

Why does Spark submit script spark-submit ignore `--num-executors`?

我们在 YARN 下运行 Spark 1.0.0,--num-executors 似乎并没有增加使用的执行器或节点的数量。我说我想要 8,但我通常以 3 到 5 结束。输出中没有错误,如果节点出现故障且无法与其通话,这就是我所期望的结果。

注意:如果您没有在 YARN 下运行,那么 num-executors 将被忽略,例如火花独立模式。请参阅已接受的答案以获取解决方案和评论。

更新:如果我要求 X 资源,我想要 X 资源,如果我不能拥有它们,我希望被放入队列或给出某种错误消息。这是因为如果我没有获得 X 资源,我的工作就会失败——我知道在我的工作失败之前我需要多少资源。我不想在我的工作上实施一些额外的层来检查我将获得多少执行程序和节点,以便它可以在它自行崩溃之前优雅地终止工作。所以问题的第二部分是“1)如果我无法获得我想要的执行程序,有没有办法告诉 YARN/Spark 失败?2)强制停止 YARN 在同一节点上放置超过 1 个执行程序“

(在 0.9.0 中这不是问题,N 个节点意味着 N 个工人和作业只会排队)

不,SparkSubmit 不会忽略 --num-executors(您甚至可以使用环境变量 SPARK_EXECUTOR_INSTANCES 或配置 spark.executor.instances)。由于资源不可用(RAM and/or CPU 核心),可能会发生实际执行程序数小于预期值的情况。

1) is there a way to tell YARN/Spark to fail if I can't get the executors I want?

不,我不这么认为。 YARN 这样不行。对于 YARN 它只是一个它无法满足的资源请求。我不确定,但这可能来自驱动程序 class,它在 ApplicationMaster 容器中执行。

2) force stop YARN from putting more than 1 executor on the same node"

Set/Configure 执行者数等于节点数。

所以是的,--num-executors 在我原来的情况下(即在 YARN 下)没有得到尊重的原因是因为某种错误行为,如果那样的话,它不会给你所有的执行者带你超过最大值cores/memory.

一种方法是 (a) 防止这种情况(从而回答我的第二个问题)和 (b) 在 运行 spark 独立模式(并因此解决注释)时强制执行多个执行程序是通过total executor cores & executor cores configs to spark-submit,并使用脚本自动计算总执行器核心数:

total_executor_cores=`expr ${num_executors} \* ${executor_cores}`

现在,如果您无法获得所需的 num executors,您将获得 "waiting" 而作业将不会开始。

对于 YARN 模式来说,有这种冲突的参数,重复信息是很烦人的。

注意:使用自动缩放集群时,您需要避免通过核心总数控制执行程序的数量,而是通过自动缩放设置控制节点数量。