【问题标题】:Apache Spark: setting executor instances does not change the executorsApache Spark:设置执行程序实例不会更改执行程序
【发布时间】:2019-06-17 17:30:13
【问题描述】:

我有一个 Apache Spark 应用程序在集群模式下运行在 YARN 集群上(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")

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

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

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

【问题讨论】:

  • yarn-site.xml中yarn.nodemanager.resource.memory-mb的值是多少??
  • Yarn.nodemanager.resource.memory-mb 是 12GiB

标签: apache-spark hadoop-yarn


【解决方案1】:

yarn-site.xml 中增加yarn.nodemanager.resource.memory-mb

每个节点 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

【讨论】:

  • 我无法增加此参数,因为我没有足够的 RAM,但我在另一个不需要那么多执行程序内存的 spark 应用程序上尝试了它,它工作正常,谢谢
  • 几天来我一直在为类似的问题苦恼。谢谢你的回答,就像一个魅力!
  • 7% 是固定的吗?我们有什么办法可以调整 7% 的开销?我可以看到设置,但它没有告诉 % 值而是 384?
  • @JoyGeorgeKunjikkuru 是的,您可以更改它,从 spark 2.3 开始,这些属性称为 spark.executor.memoryOverhead spark.driver.memoryOverhead,它们的默认值为 10%,您可以设置绝对值来更改它们.参考:spark.apache.org/docs/latest/configuration.html
  • @banjara,我没有设置执行器内存(其默认值:1GB),传递 num-executors 不符合 spark-submit。纱线中有 70GB 内存
【解决方案2】:

请注意,yarn.nodemanager.resource.memory-mb单个 NodeManager 可以跨 total 内存em>所有容器在一个节点上。

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

您为 每个 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.instances只是一个请求。您的应用程序的 Spark ApplicationMaster 将向 YARN ResourceManager 请求容器数 = spark.executor.instances。请求将由 NodeManager 节点上的 ResourceManager 授予,基于:

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

如果请求没有被批准,请求将被排队并在满足上述条件时被批准。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      集群中你只有3个节点,一个作为驱动,你只剩下2个节点,怎么创建6个executor?

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

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

      【讨论】:

      • 那么每个节点只能有一个执行者?
      • 不,每个节点有 12g 内存可用,一个执行程序占用 11g,因此您无法在同一节点上启动第二个执行程序。您可以增加 yarn.nodemanager.resource.memory-mb 或减少 --executor-memory 以在同一节点上启动多个执行器
      猜你喜欢
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多