如何解决 Amazon EMR 上 Spark 中的“ExecutorLostFailure: Slave lost”(ExecutorLostFailure:从属丢失)错误?

2 分钟阅读
0

我向 Amazon EMR 集群提交了一个 Apache Spark 应用程序,但该应用程序失败,并显示“ExecutorLostFailure: Slave lost”(ExecutorLostFailure:从属丢失)错误。

解决方法

当 Spark 任务因节点终止或不可用而失败时,您可能会收到以下错误:

“最近一次失败: 阶段 4.0 中的任务 1209.0 丢失(TID 31219,ip-###-###-##-###.compute.internal,执行程序 115): ExecutorLostFailure(执行程序 115 因正在运行的任务之一而退出)原因: 从属丢失”

以下是您可能会收到此错误的一些原因。

由于节点运行状况不佳,导致磁盘利用率较高

在 Apache Hadoop 中,NodeManager 会定期检查附加到集群节点的 Amazon Elastic Block Store (Amazon EBS) 卷。如果具有单个卷的节点上的磁盘利用率高于 YARN 属性 yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage,NodeManager 会认为该节点运行状况不佳。然后,资源管理器会关闭该节点上的所有容器,并且不会调度新的容器。有关详细信息,请参阅 Apache Hadoop 网站上的 NodeManager

在资源管理器由于节点运行状况不佳而关闭多个执行程序后,应用程序将失败,并显示 ExecutorLostFailure: Slave lost(ExecutorLostFailure:从属丢失)错误。要确认某个节点是否运行状况不佳,请查看 NodeManager 日志或实例控制器日志。yarn-env.sh 中的 YARN_LOG_DIR 变量定义了 NodeManager 日志的位置。实例控制器日志存储在主节点上的 /emr/instance-controller/log/instance-controller.log 中。实例控制器日志提供了集群中所有节点的汇总视图。

运行状况不佳的节点将显示类似于以下的日志条目:

2019-10-04 11:09:37,163 INFO Poller: InstanceJointStatusMap contains 40 entries (R:40):  i-006ba######  1829s R   1817s ig-3B ip-###-##-##-### I:    7s Y:U    11s c: 0 am:    0 H:R  0.0%Yarn unhealthy Reason : 1/1 local-dirs are bad: /mnt/yarn; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers
  i-00979######  1828s R   1817s ig-3B ip-###-##-##-### I:    7s Y:R     9s c: 3 am: 2048 H:R  0.0%
  i-016c4######  1834s R   1817s ig-3B ip-###-##-##-### I:   13s Y:R    14s c: 3 am: 2048 H:R  0.0%
  i-01be3######  1832s R   1817s ig-3B ip-###-##-##-### I:   10s Y:U    12s c: 0 am:    0 H:R  0.0%Yarn unhealthy Reason : 1/1 local-dirs are bad: /mnt/yarn; 1/1 log-dirs are bad: /var/log/hadoop-yarn/containers

要解决此问题,请增加附加到核心节点和任务节点的 EBS 卷的大小。或者,从 Hadoop Distributed File System (HDFS) 中删除未使用的数据。

竞价型实例

如果您在 Amazon EMR 集群节点中使用 Amazon Elastic Compute Cloud (EC2) 竞价型实例,且其中一个实例终止,则您可能会收到 ExecutorLostFailure: Slave lost(ExecutorLostFailure:从属丢失)错误。竞价型实例可能会因以下原因而终止:

  • 竞价型实例价格高于您的最高价格。
  • 您可用的 EC2 实例无法满足对竞价型实例的需求。

有关详细信息,请参阅竞价型实例中断

要解决此问题,请使用按需型实例。或者,如果您使用 Amazon EMR 发行版 5.11.0 或更早版本,请升级到最新版本

Amazon EC2 Auto Scaling 策略

在频繁的自动扩缩事件期间,新节点可能会收到先前节点使用的 IP 地址。如果在横向缩减事件期间运行 Spark 应用程序,则 Spark 会将已停用的节点添加到拒绝列表中,这样执行程序就不会在该节点上启动。如果发生另一个横向扩展事件,且新节点获得了与已停用节点相同的 IP 地址,则 YARN 会认为新节点是有效的。YARN 会尝试在新节点上调度执行程序。由于该节点仍在 Spark 拒绝列表中,因此执行程序启动将失败。当达到最大失败次数时,Spark 应用程序会失败,并显示 ExecutorLostFailure: Slave lost(ExecutorLostFailure:从属丢失)错误。

要解决此问题,请执行以下操作:

  • 在扩展策略中使用不太激进的规则。有关详细信息,请参阅了解自动扩缩规则
  • 增加子网中可用的 IP 地址数量。有关详细信息,请参阅子网 CIDR 块

要从 Spark 拒绝列表中移除某个节点,请减小 Spark 和 YARN 的超时属性值。完成以下步骤:

  1. 将以下参数添加到 /etc/spark/conf/spark-defaults.conf 文件中:
    spark.blacklist.decommissioning.timeout 600s
    注意:这缩短了处于正在停用状态的节点停留在拒绝列表上的时间。默认值为一小时。有关详细信息,请参阅配置节点停用行为
  2. /etc/hadoop/conf/yarn-site.xml 中修改以下 YARN 属性:
    yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs 600
    **注意:**此属性指定了在正在停用的节点转换为已停用状态之前,正在运行的容器和应用程序完成操作所需的等待时间。默认值为 3,600 秒。

有关详细信息,请参阅 Spark enhancements for elasticity and resiliency on Amazon EMR

相关信息

配置 Amazon EMR 集群实例类型以及使用竞价型实例的最佳实践

如何解决 Amazon EMR 上 Spark 作业中的阶段故障?

AWS 官方
AWS 官方已更新 2 个月前