如何對 AWS Glue 中的「Command failed with exit code」(命令失敗,隨附結束代碼) 錯誤進行疑難排解?

3 分的閱讀內容
0

我的 AWS Glue 任務失敗,並擲回「Command failed with exit code」(命令失敗,隨附結束代碼) 錯誤。

簡短描述

「Command failed with exit code X」(命令失敗,隨附結束代碼 X) 是 AWS Glue 應用程式關閉時傳回的一般錯誤訊息。當下列一個或多個條件成立時,就會發生這個錯誤:

  • AWS Glue 任務中的驅動程式或執行程式記憶體不足。
  • 作業指令碼有程式碼相關問題。
  • AWS Identity and Access Management (AWS IAM) 角色缺少存取指令碼路徑的必要權限。

若要進一步調查此錯誤,請檢閱 Amazon CloudWatch Logs 和指標

解決方法

AWS Glue Spark 任務失敗,並顯示錯誤「Command failed with exit code 1」(命令失敗,隨附結束代碼 1),且 CloudWatch 日誌顯示錯誤「java.lang.OutOfMemoryError: Java 堆積空間」

此 AWS Glue 錯誤表示任務中的驅動程式或執行程式處理序記憶體不足。若要檢查驅動程式或執行程式是否造成記憶體不足 (OOM) 例外狀況,請檢閱 glue.driver.jvm.heap.usageglue.executorID.heap.usage 的 CloudWatch 指標。如需詳細資訊,請參閱使用 Amazon CloudWatch 指標監控 AWS Glue

若要對驅動程式造成的 OOM 例外狀況進行疑難排解,請參閱如何解決 AWS Glue Spark 任務中的「java.lang.OutOfMemoryError: Java 堆積空間」錯誤?對驅動程式 OOM 例外狀況進行偵錯

若要對執行程式造成的 OOM 例外狀況進行疑難排解,請參閱對執行程式 OOM 例外狀況進行偵錯

執行程式失敗,並顯示「Command failed with exit code 1」(命令失敗,隨附結束代碼 1)

當您取消 AWS Glue 任務時,就會發生此錯誤。當您強制關閉執行程式並終止驅動程式時,也會發生此錯誤。如需有關該錯誤的詳細資訊,請檢閱適用於 AWS Glue 的 CloudWatch 日誌。

AWS Glue 0.9/1.0 版 Spark 任務失敗,並顯示錯誤「Command failed with exit code 1」(命令失敗,隨附結束代碼 1),且 CloudWatch 日誌顯示錯誤「Container killed by YARN for exceeding memory limits」 (超過記憶體限制導致 YARN 結束容器)

注意: AWS Glue 1.0 版 Spark 任務已終止支援。為了提高效能,請升級至 Glue 2.0 或更新版本。

此 AWS Glue 錯誤表示執行程式造成 OOM 例外狀況。若要對此錯誤進行疑難排解,請參閱對執行程式 OOM 例外狀況進行偵錯

AWS Glue Python Shell 任務失敗,並顯示錯誤「Command failed with exit code 1」(命令失敗,隨附結束代碼 1)

此錯誤表示 AWS Glue IAM 角色沒有從 Amazon Simple Storage Service (Amazon S3) 路徑存取 AWS Glue 指令碼的許可。檢閱 AWS Glue IAM 角色存取指令碼位置路徑所必須具備的許可。然後,將這些許可附加至該 IAM 角色。

AWS Glue 任務失敗,並顯示錯誤「Command failed with exit code 1」(命令失敗,隨附結束代碼 1),且無法啟動

檢查 CloudWatch 任務日誌是否具有 Amazon S3 相關錯誤。在日誌中,您可能會收到類似下列內容的錯誤:

com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied' Request ID: xxxxxxxxxxxxx)

當 AWS Glue IAM 角色沒有從 Amazon S3 路徑存取 AWS Glue ETL 指令碼的許可時,就會發生此錯誤。檢閱 AWS Glue IAM 角色存取指令碼位置路徑所必須具備的許可。然後,將這些許可附加至該 IAM 角色。

即使具備正確的 IAM 和 S3 儲存貯體許可,AWS Glue 任務偶爾會失敗,並顯示「Command failed with exit code 10」(命令失敗,隨附結束代碼 10),且 CloudWatch 日誌顯示錯誤

com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied' Request ID: xxxxxxxxxxxxx)

此 AWS Glue 錯誤發生於 AWS Glue 3.0 或 4.0 版。當您使用 AWS Glue 安全組態,但 S3 儲存貯體原則拒絕未加密的 se:putObject 時,就會發生此錯誤。

若要解決此問題,請在指令碼開頭執行 job.init(),使 AWS Glue 安全組態生效。如果您在 job.init() 前啟動 Spark 工作階段,則將覆寫 Spark 安全組態屬性,並發生錯誤。

請參閱以下範例:

job = Job(glueContext)
job.init(args["JOB_NAME"], args)

#Use one of the following depending on whether Spark configuration is being set or not
spark = glueContext.spark_session
spark = glueContext.spark_session.builder.enableHiveSupport().config("hive.exec.dynamic.partition","true").config("hive.exec.dynamic.partition.mode", "nonstrict").getOrCreate()

如需 AWS Glue 安全組態的詳細資訊,請參閱加密爬蟲程式、任務和開發端點寫入的資料

AWS Glue 任務失敗,並顯示錯誤「Command failed with exit code X」(命令失敗,隨附結束代碼 X),且 JAR 檔案已傳遞至任務

您可能會在 CloudWatch 日誌中發現下列其中一個錯誤:

「「主」執行緒 java.lang.NoSuchMethodError 的例外狀況」

「「主」執行緒 java.lang.ExceptionInInitializerError 的例外狀況」

這些錯誤表示 JAR 依賴於衝突或 Spark 版本衝突。檢查 JAR 可執行檔以及在任務中傳遞的額外 JAR 檔案是否有衝突。如果您要傳遞多個 JAR 檔案,請一次移除一個 JAR 檔案,然後重新執行 AWS Glue 任務。如此一來,您就可以隔離造成此問題的檔案。


相關資訊

使用 Apache Spark Web UI 監控任務

為什麼我的 AWS Glue ETL 任務失敗,並顯示錯誤「Container killed by YARN for exceeding memory limits」 (超過記憶體限制導致 YARN 結束容器)?

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