scala 为什么spark在机器上旋转的执行程序比可用的核心多?

gopyfrb3  于 2023-10-18  发布在  Scala
关注(0)|答案(1)|浏览(130)

我经常看到spark在一个给定的节点上旋转了比它应该旋转的更多的执行器。这会使节点上的平均负载激增,最终导致executor lostbad nodeunhealthy node
我的spark配置如下
1.每个节点:8核,32 GB;主节点、核心节点和任务节点上的yarn. node manager.resource.cpu-vcores设置为6。这意味着最多6个执行器应该在一个节点上运行。
1.很少有作业运行2核,8 GB; 1核2GB的很少;--意味着即使在最坏的情况下,一个节点也应该最多旋转6个容器。然而(上图)我看到9个容器旋转。
1.在ganglia上,我看到节点的平均负载为19(而节点只有8个vcore)--由于这样高的平均负载,执行程序正在丢失(驱动程序无法及时获得心跳;由于平均负载高,执行器运行缓慢)
1.我们使用EMR 6.9; Spark 3.2.0
问题:
1.为什么Spark spin的executors比配置的多?
1.在这种情况下,是否可以将最大执行器限制为6个?
1.在另一个节点上,5个核心和25 GB可用,但为什么spark/ yarn没有选择在那里旋转执行器?

我的AWS-EMR启动配置JSON文件如下。这是主节点、任务节点和核心节点的节点配置(所有节点的JSON相同)。
我为心跳等添加了高值。只是为了确保执行者不会丢失一个作业运行1-1.5小时;只要执行者能坚持一会儿,工作就完成了,否则1.5小时的努力就白费了。

[
  {
    "Classification": "yarn-site",
    "Properties": {
      "yarn.nodemanager.resource.cpu-vcores": "6",
      "yarn.nodemanager.resource.memory-mb": "30000",
      "yarn.resourcemanager.nodemanagers.heartbeat-interval-max-ms":"60000",
      "yarn.resourcemanager.nodemanagers.heartbeat-interval-min-ms":"60000",
      "yarn.resourcemanager.nodemanagers.heartbeat-interval-ms":"60000",
      "yarn.nodemanager.health-checker.timeout-ms":"72000000",
      "yarn.nodemanager.health-checker.interval-ms":"36000000",
      "yarn.resourcemanager.application-timeouts.monitor.interval-ms":"180000"
    }
  },
  {
    "Classification": "mapred-site",
    "Properties": {
      "yarn.app.mapreduce.am.scheduler.heartbeat.interval-ms":"60000",
      "yarn.app.mapreduce.am.hard-kill-timeout-ms":"600000"
    }
  },
  {
    "Classification": "spark-defaults",
    "Properties": {
      "spark.executor.heartbeatInterval": "600s",
      "spark.network.timeout":"7200s"
    }
  }
]
iibxawm4

iibxawm41#

我终于找到了解决办法。显然,yarn的capacity-scheduler有一个bug,当有足够的内存用于新的执行器时,它会过度分配执行器。现在,这可以通过设置标志来解决

"yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator"

in /capacity-scheduler.conf
在我的情况下,因为我使用EMR,下面的配置帮助。

[
  {
    "Classification": "yarn-site",
    "Properties": {
      "yarn.nodemanager.resource.cpu-vcores": "5"
    }
  },
  {
    "Classification": "capacity-scheduler",
    "Properties": {
      "yarn.scheduler.capacity.resource-calculator": "org.apache.hadoop.yarn.util.resource.DominantResourceCalculator"
    }
  }
]

使用上面的JSON,我验证了,现在Yarn不会在节点上为执行器分配超过配置的核心。
步骤:(新建emr控制台>选择集群>配置>示例组配置>选择master radio > reconfigure >然后给予上面的json >保存)

相关问题