我经常看到spark在一个给定的节点上旋转了比它应该旋转的更多的执行器。这会使节点上的平均负载激增,最终导致executor lost
或bad node
或unhealthy 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"
}
}
]
1条答案
按热度按时间iibxawm41#
我终于找到了解决办法。显然,yarn的
capacity-scheduler
有一个bug,当有足够的内存用于新的执行器时,它会过度分配执行器。现在,这可以通过设置标志来解决in /capacity-scheduler.conf
在我的情况下,因为我使用EMR,下面的配置帮助。
使用上面的JSON,我验证了,现在Yarn不会在节点上为执行器分配超过配置的核心。
步骤:(新建emr控制台>选择集群>配置>示例组配置>选择master radio > reconfigure >然后给予上面的json >保存)