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

时间:2015-04-29 10:14:03

标签: apache-spark yarn

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

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

private static void SetPublicProperties(Type type, object obj, Dictionary<Type, object> createdObjectReferences) { PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); ObjectGenerator objectGenerator = new ObjectGenerator(); foreach (PropertyInfo property in properties) { if (property.IsDefined(typeof (TextSampleAttribute), false)) { object propertyValue = property.GetCustomAttribute<TextSampleAttribute>().Value; property.SetValue(obj, propertyValue, null); } else if (property.CanWrite) { object propertyValue = objectGenerator.GenerateObject(property.PropertyType, createdObjectReferences); property.SetValue(obj, propertyValue, null); } } }

但是,执行人数仍为2。

在spark UI上我可以看到参数spark.executor.instances是6,就像我想的那样,并且不知何故仍然只有2个执行器。

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

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

同样,我可以看到参数设置为6,但仍然只有2个执行器。

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

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

4 个答案:

答案 0 :(得分:14)

yarn.nodemanager.resource.memory-mb

中增加yarn-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

答案 1 :(得分:10)

请注意yarn.nodemanager.resource.memory-mb 内存, NodeManager可以在中分配> 一个节点上的所有 容器。

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

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

  • 因为您必须考虑spark.yarn.executor.memoryOverheadmin(executorMemory * 0.10, 384)默认,除非您覆盖它)。

因此,遵循数学必须成立:

spark.executor.memory + spark.yarn.executor.memoryOverhead &lt; = yarn.nodemanager.resource.memory-mb

有关spark.yarn.executor.memoryOverhead

的最新文档,请参阅:https://spark.apache.org/docs/latest/running-on-yarn.html

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

  • 节点上的资源可用性。 YARN调度有其自身的细微差别 - this是关于YARN FairScheduler如何运作的良好入门。
  • 节点上是否未超过yarn.nodemanager.resource.memory-mb阈值:
    • (节点上运行的火花容器数*(spark.executor.memory + spark.yarn.executor.memoryOverhead))&lt; = yarn.nodemanager.resource.memory-mb *

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

答案 2 :(得分:2)

要将spark群集充分利用它,您需要根据群集为--num-executors, - executor-cores和--executor-memory设置值。

--num-executors命令行标志或spark.executor.instances配置属性控制请求的执行程序数。

--executor-cores命令行标志或spark.executor.cores配置属性控制执行程序可以运行的并发任务数。

--executor-memory命令行标志或spark.executor.memory配置属性控制堆大小。

答案 3 :(得分:1)

群集中只有3个节点,其中一个将用作驱动程序,只剩下2个节点,如何创建6个执行程序?

我认为您将--num-executors--executor-cores混为一谈。

要增加并发性,您需要更多内核,您希望利用群集中的所有CPU。