我提交了 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.sh 的 YARN_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 EMR 發行版 5.11.0 或更早版本,請考慮升級至最新版本。
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 作業的階段失敗進行疑難排解?