跳至內容

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

2 分的閱讀內容
0

我向 Amazon EMR 叢集提交了一個 Apache Spark 應用程式,但該應用程式失敗並出現「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 會認為該節點運作狀態不佳。然後,ResourceManager 會關閉該節點上的所有容器,並且不再安排新的容器。如需詳細資訊,請參閱 Apache Hadoop 網站上的 NodeManager

由於節點運作狀態不佳,ResourceManager 關閉多個執行程式後,應用程式會失敗並顯示 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 分散式檔案系統 (HDFS) 中刪除未使用的資料。

Spot 執行個體

如果您將 Amazon Elastic Compute Cloud (EC2) Spot 執行個體用於 Amazon EMR 叢集節點,並且其中一個執行個體終止,那麼您可能會收到 ExecutorLostFailure: 從屬遺失錯誤。Spot 執行個體可能會因下列原因而終止:

  • Spot 執行個體價格高於您的最高價格。
  • 您可使用的 EC2 執行個體無法滿足 Spot 執行個體的需求。

如需詳細資訊,請參閱 Spot 執行個體中斷

若要解決此問題,請使用隨需執行個體。或者,如果您使用 Amazon EMR 發行版 5.11.0 或更早版本,請升級至最新版本

Amazon EC2 Auto Scaling 政策

在頻繁的 Auto Scaling 事件期間,新節點可能會收到前一個節點所使用的 IP 位址。如果 Spark 應用程式在縮減事件期間執行,則 Spark 會將已停用的節點新增至拒絕清單中,使執行程式不會在該節點上啟動。如果發生另一個橫向擴充事件,並且新節點取得與已停用節點相同的 IP 位址,則 YARN 會將新節點視為有效。YARN 會嘗試在新節點上排程執行程式。由於節點仍在 Spark 拒絕清單中,執行程式啟動失敗。當達到最大失敗次數時,Spark 應用程式將會失敗,並顯示 ExecutorLostFailure: 從屬遺失錯誤。

若要解決此錯誤,請執行下列動作:

若要從 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
    **注意:**此屬性指定在停用中節點轉換至已停用狀態之前,等待執行中容器和應用程式完成的時間。預設值為 3600 秒。

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

相關資訊

設定 Amazon EMR 叢集執行個體類型以及 Spot 執行個體的最佳做法

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

AWS 官方已更新 8 個月前