Apache Spark:设置执行程序实例不会更改执行程序

use*_*877 15 hadoop-yarn apache-spark

我在集群模式下在YARN集群上运行Apache Spark应用程序(spark在此集群上有3个节点).

当应用程序运行时,Spark-UI显示2个执行程序(每个执行程序在不同的节点上运行)和驱动程序在第三个节点上运行.我希望应用程序使用更多的执行程序,所以我尝试将参数--num-executors添加到Spark-submit并将其设置为6.

spark-submit --driver-memory 3G --num-executors 6 --class main.Application --executor-memory 11G --master yarn-cluster myJar.jar <arg1> <arg2> <arg3> ...

但是,执行人数仍然是2.

在spark UI上我可以看到参数spark.executor.instances是6,正如我的意图,并且不知何故仍然只有2个执行器.

我甚至尝试从代码中设置此参数

sparkConf.set("spark.executor.instances", "6")
Run Code Online (Sandbox Code Playgroud)

再次,我可以看到参数设置为6,但仍然只有2个执行程序.

有谁知道为什么我不能增加执行人的数量?

yarn.nodemanager.resource.memory-mb在yarn-site.xml中是12g

ban*_*ara 15

增加yarn.nodemanager.resource.memory-mbyarn-site.xml

每个节点12g,您只能启动驱动程序(3g)和2个执行程序(11g).

Node1 - 驱动程序3g(开销+ 7%)

Node2 - executor1 11g(开销+ 7%)

Node3 - executor2 11g(开销+ 7%)

现在你要求11g的executor3,没有节点有11g内存可用.

7%的开销请参考https://spark.apache.org/docs/1.2.0/running-on-yarn.html中的 spark.yarn.executor.memoryOverhead和spark.yarn.driver.memoryOverhead


use*_*028 10

注意,yarn.nodemanager.resource.memory-mb的是一存储器节点管理器可以在分配所有的容器在一个节点上.

在您的情况下,因为yarn.nodemanager.resource.memory-mb = 12G,如果您在任何单个节点上添加分配给所有YARN容器的内存,则它不能超过12G.

您已-executor-memory 11G每个 Spark Executor容器请求了11G().虽然11G小于12G,但这仍然不起作用.为什么?

  • 因为你必须考虑spark.yarn.executor.memoryOverhead,这是min(executorMemory * 0.10, 384)(默认情况下,除非你覆盖它).

所以,遵循数学必须成立:

spark.executor.memory+ spark.yarn.executor.memoryOverhead <= yarn.nodemanager.resource.memory-mb

请参阅:https://spark.apache.org/docs/latest/running-on-yarn.html以获取最新文档spark.yarn.executor.memoryOverhead

此外,spark.executor.instances仅仅请求.您的应用程序的Spark ApplicationMaster将向YARN ResourceManager请求容器数量= spark.executor.instances.ResourceManager将在NodeManager节点上根据以下内容授予请求:

  • 节点上的资源可用性.YARN调度有其自身的细微差别 - 是YARN FairScheduler工作原理的一个很好的入门读物.
  • 是否yarn.nodemanager.resource.memory-mb在节点上未超过阈值:
    • (节点上运行的火花容器数量*(spark.executor.memory+ spark.yarn.executor.memoryOverhead))<= yarn.nodemanager.resource.memory-mb*

如果未授予请求,则在满足上述条件时,请求将排队并被授予.