如何解決 Amazon EMR 上 Spark 中的 ExecutorLostFailure「從屬遺失」錯誤?

2 分的閱讀內容
0

我提交了 Apache Spark 應用程式到 Amazon EMR 叢集。應用程式失敗,並顯示以下錯誤: 「最近的失敗: 在階段 4.0 中遺失了任務 1209.0 (TID 31219, ip-xxx-xxx-xx-xxx.compute.internal, executor 115): ExecutorLostFailure (執行中的一項任務造成執行程式 115 退出) 原因: 從屬遺失」

簡短描述

此錯誤表示 Spark 任務因為節點終止或無法使用而失敗。此錯誤有許多可能的原因。下列解決方法涵蓋了這些常見的根本原因:

  • 磁碟使用率高
  • Spot 執行個體用於叢集節點
  • 激進的 Amazon Elastic Compute Cloud (Amazon EC2) 自動擴展原則

解決方法

磁碟使用率高

在 Hadoop 中,NodeManager 會定期檢查附加到叢集節點的 Amazon Elastic Block Store (Amazon EBS) 磁碟區。如果附加了一個磁碟區的節點上的磁碟使用率大於 YARN 屬性 yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage (預設值 90%),則該節點會被視為不健康。當節點不健康時,ResourceManager 會終止在該節點上執行的所有容器。ResourceManager 不會在不健康的節點上排程新容器。如需詳細資訊,請參閱 Hadoop 文件中的 NodeManager

如果 ResourceManager 因為不健康的節點而終止多個執行程式,則應用程式會失敗並顯示「從屬遺失」錯誤。若要確認節點不健康,請檢閱 NodeManager 日誌或執行個體控制器日誌:

  • NodeManager 日誌的位置在 yarn-env.shYARN_LOG_DIR 變數中定義。
  • 執行個體控制器日誌儲存在主節點上的 /emr/instance-controller/log/instance-controller.log 中。執行個體控制器日誌提供叢集所有節點的彙總檢視。

如果節點不健康,日誌會顯示如下所示的項目:

2019-10-04 11:09:37,163 INFO Poller: InstanceJointStatusMap contains 40 entries (R:40):
  i-006baxxxxxx  1829s R   1817s ig-3B ip-xxx-xx-xx-xxx 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-00979xxxxxx  1828s R   1817s ig-3B ip-xxx-xx-xx-xxx I:    7s Y:R     9s c: 3 am: 2048 H:R  0.0%
  i-016c4xxxxxx  1834s R   1817s ig-3B ip-xxx-xx-xx-xxx I:   13s Y:R    14s c: 3 am: 2048 H:R  0.0%
  i-01be3xxxxxx  1832s R   1817s ig-3B ip-xxx-xx-xx-xxx 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 磁碟區大小。或者,從 HDFS 中刪除未使用的資料。

Spot 執行個體

如果您將 Amazon EC2 Spot 執行個體用於 EMR 叢集節點,且其中一個執行個體終止,您可能會收到「從屬遺失」錯誤。Spot 執行個體可能會因下列原因而終止:

  • Spot Instant 價格高於您的最高價格。
  • 沒有足夠的未使用 EC2 執行個體來滿足 Spot 執行個體的需求。

如需詳細資訊,請參閱中斷原因

若要解決此問題:

Amazon EC2 Auto Scaling 政策

當擴展政策按順序執行許多向內擴展和向外擴展事件時,新節點可能會取得上一個節點所使用的相同 IP 地址。如果 Spark 應用程式在向內擴展事件期間執行,Spark 會將已停用的節點新增至拒絕清單,以防止執行程式在該節點上啟動。如果發生另一個向外擴展事件,且新節點取得與先前停用的節點相同的 IP 位址,YARN 會將新節點視為有效,並嘗試在其上排定執行程式。但是,由於節點仍在 Spark 拒絕清單上,因此嘗試在該節點上啟動執行程式會失敗。當您達到最大失敗次數時,Spark 應用程式會失敗,並顯示「從屬遺失」錯誤。

若要解決此問題:

若要從 Spark 拒絕清單中移除節點,請減小 Spark 和 YARN 逾時屬性,如下列範例所示:

/etc/spark/conf/spark-defaults.conf 中新增下列屬性。這可減少處於正在停用狀態的節點在拒絕清單上保持的時間。預設值為一小時。如需詳細資訊,請參閱設定節點停用行為

spark.blacklist.decommissioning.timeout 600s

/etc/hadoop/conf/yarn-site.xml 中修改下列 YARN 屬性。此屬性指定在正在停用的節點轉換至已停用狀態之前,等待執行中容器和應用程式完成的時間長度。預設值為 3600 秒。

yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs 600

如需詳細資訊,請參閱 Spark 增強 Amazon EMR 的彈性和適應力


相關資訊

叢集組態準則和最佳做法

如何對 Amazon EMR 上 Spark 作業的階段失敗進行疑難排解?

AWS 官方
AWS 官方已更新 2 年前