首页 文章

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

提问于
浏览
12

我在集群模式下在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个 Actuator .

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

sparkConf.set("spark.executor.instances", "6")

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

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

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

4 回答

  • 1

    增加 yarn.nodemanager.resource.memory-mb in 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

  • 8

    请注意 yarn.nodemanager.resource.memory-mbtotal 内存, single NodeManager可以在一个节点上的 all 容器中分配 .

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

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

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

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

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

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

    而且, spark.executor.instancesmerely a request . 应用程序的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 )) <= yarn.nodemanager.resource.memory-mb *

    如果未授予请求,则在满足上述条件时授予 request will be queued .

  • 12

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

    我觉得你把 --num-executors--executor-cores 搞糊涂了 .

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

  • 1

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

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

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

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

相关问题