Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark ApacheSpark:设置执行器实例不会更改执行器_Apache Spark_Yarn - Fatal编程技术网

Apache spark ApacheSpark:设置执行器实例不会更改执行器

Apache spark ApacheSpark:设置执行器实例不会更改执行器,apache-spark,yarn,Apache Spark,Yarn,我有一个apachespark应用程序在集群模式下的纱线集群上运行(Spark在这个集群上有3个节点) 当应用程序运行时,Spark UI显示2个执行器(每个执行器在不同的节点上运行)和驱动程序在第三个节点上运行。 我希望应用程序使用更多的执行器,所以我尝试添加参数--num executors to Spark submit并将其设置为6 spark submit--driver memory 3G--num executors 6--class main.Application--execu

我有一个apachespark应用程序在集群模式下的纱线集群上运行(Spark在这个集群上有3个节点)

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

spark submit--driver memory 3G--num executors 6--class main.Application--executor memory 11G--master warn cluster myJar.jar…

然而,执行人的人数仍然是2人

在spark UI上,我可以看到参数spark.executor.instances是6,正如我预期的那样,但不知何故,仍然只有2个执行器

我甚至试着从代码中设置这个参数

sparkConf.set("spark.executor.instances", "6")
同样,我可以看到参数设置为6,但仍然只有2个执行器

有人知道我为什么不能增加遗嘱执行人的人数吗


纱线.nodemanager.resource.memory-mb在纱线站点.xml中为12g

增加
纱线.nodemanager.resource.memory mb在
纱线站点.xml中为

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

节点1-驱动程序3g(+7%开销)

节点2-执行器1 11g(+7%开销)

节点3-执行器2 11g(+7%开销)

现在您正在请求11g的Executor 3,并且没有节点具有11g内存可用


有关7%的开销,请参阅

中的spark.Thread.executor.memoryOverhead和spark.Thread.driver.memoryOverhead。群集中只有3个节点,其中一个将用作驱动程序,您只剩下2个节点,如何创建6个执行器

我认为您将
--num executors
--executor cores
混淆了


要提高并发性,您需要更多的内核,您需要利用集群中的所有CPU。

要充分利用spark集群的容量,您需要根据集群设置
--num executors
--executor cores
--executor memory
的值:

  • --num executors
    命令行标志或
    spark.executor.instances
    配置属性控制请求的执行器数量
  • ——executor cores
    命令行标志或
    spark.executor.cores
    配置属性控制执行器可以运行的并发任务数
  • --executor memory
    命令行标志或
    spark.executor.memory
    配置属性控制堆大小

请注意,
warn.nodemanager.resource.memory mb
单个节点管理员可以跨一个节点上的所有容器分配的总内存

在您的情况下,由于
warn.nodemanager.resource.memory-mb=12G
,如果您将分配给任何单个节点上的所有warn容器的内存相加,它不能超过12G

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

  • 因为您必须考虑
    spark.Thread.executor.memoryOverhead
    ,它是
    min(executorMemory*0.10384)
    (默认情况下,除非您覆盖它)
因此,以下数学必须成立:


spark.executor.memory
+
spark.warn.executor.memoryOverhead
纱线站点.xml中的warn.nodemanager.resource.memory-mb的值是多少?warn.nodemanager.resource.memory-mb是12gib,因此每个节点只能有一个执行器?不,每个节点有12g内存,一个执行器占用11g,所以不能在同一节点上启动第二个执行器。您可以增加Thread.nodemanager.resource.memory-mb或减少--executor memory以在同一个节点上启动多个执行器我无法增加此参数,因为我没有足够的RAM,但我在另一个spark应用程序上尝试了它,该应用程序不需要那么多执行器内存,而且运行正常,thanksI已经为类似的问题苦恼了几天。谢谢你的回答,工作得很有魅力!7%是固定的吗?我们可以调整7%的管理费用吗?我可以看到设置,但它没有告诉您%的值,而是384?@JoyGeorgeKunjikkuru是的,您可以更改它,spark 2.3以后这些属性称为spark.executor.memoryOverhead spark.driver.memoryOverhead,默认值为10%,您可以设置绝对值来更改它们。请参阅:@banjara,我没有设置执行器内存(默认为1GB),使用spark submit不支持传递num executors。我有70GB的内存