為什麼我在 Amazon EMR 中的 Spark 任務失敗了?

3 分的閱讀內容
0

我在 Amazon EMR 中的 Apache Spark 任務失敗。

解決方案

應用程式失敗

錯誤 ShuffleBlockFetcherIterator: 無法從 ip-192-168-14-250.us-east-2.compute.internal:7337 取得區塊

org.apache.spark.network .client.ChunkFetchFailureException: 擷取 StreamChunkId[streamId=842490577174,chunkIndex=0] 時失敗: java.lang.RuntimeException: 未註冊執行程式 (appId=application_1622819239076_0367, execId=661)

Amazon EMR 中的執行程式工作節點處於運作狀態不良時,可能會發生此問題。當工作節點的磁碟使用率超過 90% 使用率閾值時,YARN NodeManager 運作狀態服務會將該節點報告為運作狀態不良。運作狀態不良的節點包含在 Amazon EMR 拒絕清單中。此外,YARN 容器不會分配給那些節點。

若要對此問題進行疑難排解,請執行以下操作:

錯誤 [Executor task launch worker for task 631836] o.a.s.e.Executor:Exception in task 24.0 in stage 13028.0 (TID 631836) java.util.NoSuchElementException: None.get

當應用程式程式碼和 SparkContext 初始化中有問題時,就會發生此錯誤。

確保在同一個工作階段中沒有多個作用中的 SparkContext 任務。根據 Java 虛擬機器 (JVM),您每次可以有一個作用中的 SparkContext。如果您想初始化另一個 SparkContext,那麼你必須在建立一個新的任務之前停止作用中任務。

容器依請求終止。結束代碼為 137

當 YARN 容器中的任務超過分配給該容器的實體記憶體時,就會發生此例外狀況。當您有隨機分割區、不一致的分割區大小或大量執行程式核心時,通常會發生此情況。

檢閱 Spark 驅動程式日誌中的錯誤詳細資料,以判斷錯誤的原因。如需詳細資訊,請參閱如何存取 Amazon EMR 叢集上的 Spark 驅動程式日誌?

以下是驅動程式日誌中的範例錯誤:

ERROR YarnScheduler: Lost executor 19 on ip-10-109-xx-xxx.aws.com : Container from a bad node: container_1658329343444_0018_01_000020 on host: ip-10-109-xx-xxx.aws.com . Exit status: 137.Diagnostics:
Container killed on request. Exit code is 137
Container exited with a non-zero exit code 137.
Killed by external signal
Executor container 'container_1658329343444_0018_01_000020' was killed with exit code 137. To understand the root cause, you can analyze executor container log.
# java.lang.OutOfMemoryError: Java heap space
# -XX:OnOutOfMemoryError="kill -9 %p"
# Executing /bin/sh -c "kill -9 23573"...

前面的錯誤堆疊追蹤表示執行程式上沒有足夠的可用記憶體來繼續處理資料。此錯誤可能會發生在狹窄和寬敞轉換的不同任務階段。

若要解決此問題,請執行下列其中一個動作:

  • 增加執行程式記憶體。
    **注意:**執行程式記憶體包括執行任務所需的記憶體加上開銷記憶體。這些總和不得大於 JVM 的大小和 YARN 最大容器大小。
  • 增加更多 Spark 分割區。
  • 增加隨機分割區的數量。
  • 減少執行程式核心的數量。

如需詳細資訊,請參閱如何解決 Amazon EMR 上 Spark 中的 "Container killed on request. Exit code is 137 (容器依請求終止。退出代碼是 137)" 錯誤?

Spark 任務處於懸置狀態且未完成

Spark 任務可能因多種原因而卡住。例如,如果 Spark 驅動程式 (應用程式主機) 程序受到影響,或遺失執行程式容器。

當您的磁碟空間使用率很高,或者在叢集節點使用 Spot 執行個體且 Spot 執行個體終止時,通常會發生這種情況。如需詳細資訊,請參閱如何解決 Amazon EMR 上 Spark 中的 ExecutorLostFailure "Slave lost (從屬遺失)" 錯誤?

若要對此問題進行疑難排解,請執行以下操作:

  • 檢閱 Spark 應用程式主機或驅動程式日誌是否有任何例外狀況。
  • 驗證 YARN 節點清單是否有運作狀態不良的節點。當核心節點的磁碟使用率超過使用率閾值時,YARN 節點管理員運作狀態服務會將節點報告為運作狀態不良。運作狀態不良的節點包含在 Amazon EMR 拒絕清單中。此外,YARN 容器不會分配給那些節點。
  • 監控磁碟空間使用率,並設定 Amazon Elastic Block Store (Amazon EBS) 磁碟區,將 EMR 叢集工作節點的使用率保持在 90% 以下。

警告執行程式:與在活動訊號中的驅動程式通訊時發生問題 org.apache.spark.rpc.RpcTimeoutException: Futures timed out after [10000 milliseconds].此逾時由 spark.executor.heartbeatInterval 控制

Spark 執行程式在由 spark.executor.heartbeatInterval 屬性指定的間隔將活動訊號發送至由 Spark 驅動程式。在長時間的垃圾回收暫停期間,執行程式可能不會發送活動訊號。驅動程式刪除無法發送超過指定值的活動訊號的執行程式。

TimeoutException

當執行程式處理資料時受記憶體限制或面臨 OOM 問題,則會發生逾時例外狀況。這也會影響垃圾回收程序,造成進一步的延遲。

使用下列其中一種方法來解決活動訊號逾時錯誤:

  • 增加執行程式記憶體。此外,根據應用程式的程序,重新分割您的資料。
  • 調整垃圾回收
  • spark.executor.heartbeatInterval 增加間隔。
  • 指定較長的 spark.network.timeout 期間

ExecutorLostFailure "Exit status: -100. Diagnostics: Container released on a *lost* node (結束狀態:-100。診斷:容器在 *遺失* 節點上釋放)"

當核心或任務節點因為磁碟空間使用率過高而終止時,就會發生此錯誤。當節點因 CPU 使用率過長或可用記憶體不足而變得沒有回應時,也會發生此錯誤。如需疑難排解步驟,請參閱如何解決 "Exit status: -100. Diagnostics: Container released on a *lost* node" errors in Amazon EMR (結束狀態:-100。診斷:容器在 Amazon EMR 中的 *遺失* 節點上釋放)" 錯誤?

**注意:**當您將 Spot 執行個體用於叢集節點,且 Spot 執行個體終止時,也可能會發生此錯誤。在此案例中,EMR 叢集佈建隨需執行個體,以取代已終止的 Spot 執行個體。這表示應用程式可能會自行復原。如需詳細資訊,請參閱 Spark 增強功能改善 Amazon EMR 的彈性和靈活度

executor 38: java.sql.SQLException (Network error IOException: Connection timed out (Connection timed out) (執行程式 38:java.sql.SQLException (網絡錯誤 IOException:連接逾時 (連線逾時)

這個問題與讀取或寫入資料時建立通訊端連線的 SQL 資料庫通訊有關。驗證資料庫主機可從 EMR 叢集安全群組接收在連接埠 1433 上的傳入連線。

此外,請檢閱為 SQL DB 設定的平行資料庫連線數目上限,以及資料庫執行個體類別的記憶體分配。資料庫連線也會消耗記憶體。如果使用率很高,請檢閱資料庫組態和允許的連線數目。如需詳細資訊,請參閱資料庫連線的數目上限

Amazon S3 例外狀況

HTTP 503 "Slow Down (減速)"

當您超出前綴的 Amazon Simple Storage Service (Amazon S3) 請求率時,就會發生 HTTP 503 例外狀況。503 例外狀況並不總是意味著會發生故障。但是,緩解問題可以提升應用程式的效能。

如需詳細資訊,請參閱為什麼我在 Amazon EMR 上的 Spark 或 Hive 任務會失敗並出現 HTTP 503 "Slow Down (減速)" AmazonS3Exception?

HTTP 403 "Access Denied (存取遭拒)"

HTTP 403 錯誤是由不正確或無效的憑證造成的,例如:

  • 您應用程式的程式碼中指定的憑證或角色。
  • 附加到 Amazon EC2 執行個體設定檔角色的政策。
  • 適用於 Amazon S3 的 Amazon Virtual Private Cloud (Amazon VPC) 端點。
  • S3 來源和目的地儲存貯體政策。

若要解決 403 錯誤,請確保相關的 AWS Identity and Access Management (IAM) 角色或政策允許存取 Amazon S3。如需詳細資訊,請參閱為什麼我的 Amazon EMR 應用程式失敗,出現 HTTP 403 "Access Denied (存取遭拒)" AmazonS3Exception?

HTTP 404 "Not Found (找不到)"

HTTP 404 錯誤指出應用程式希望在 S3 中找到一個物件,但在請求時未找到該物件。常見原因包括:

  • 不正確的 S3 路徑 (例如,路徑輸入錯誤)。
  • 該檔案被應用程式外的程序移動或刪除。
  • 造成最終一致性問題的操作,例如覆寫。

如需詳細資訊,請參閱為何我的 Amazon EMR 應用程式失敗並顯示 HTTP 404 "Not Found (找不到)" AmazonS3Exception?


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