如何解决 AWS Glue 中的“Command failed with exit code”(命令失败,退出代码为 X)错误?

3 分钟阅读
0

我的 AWS Glue 任务失败,并且出现“Command failed with exit code”(命令失败,退出代码为 X)错误。

简短描述

“Command failed with exit code X”(命令失败,退出代码为 X)是 AWS Glue 应用程序关闭时返回的通用错误消息。当以下一个或多个条件成立时,就会出现此错误:

  • AWS Glue 任务中的驱动程序或执行程序内存不足。
  • 任务脚本存在与代码相关的问题。
  • AWS Identity and Access Management(AWS IAM)角色缺少访问脚本路径所需的权限。

要进一步调查此错误,请查看 Amazon CloudWatch 日志和指标

解决方法

AWS Glue Spark 任务失败,出现错误“Command failed with exit code 1”(命令失败,退出代码为 1),CloudWatch 日志显示错误“java.lang.outofMemoryError: Java heap space”(java.lang.outofMemoryError:Java 堆空间)

此 AWS Glue 错误表明任务中的驱动程序或执行程序进程内存不足。要检查是否是驱动程序或执行程序导致了内存不足(OOM)异常,请查看 CloudWatch 的 glue.driver.jvm.heap.usageglue.executorID.heap.usage 指标。有关详细信息,请参阅使用 Amazon CloudWatch 指标监控 AWS Glue

要解决由驱动程序引起的 OOM 异常,请参阅如何解决 AWS Glue Spark 任务中的“java.lang.OutOfMemoryError: Java heap space”(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 角色。

AWS Glue 任务偶尔会失败,出现错误“Command failed with exit code 10”(命令失败,退出代码为 10),而且即使 IAM 和 S3 桶的权限正确,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 日志中发现以下错误之一:

“Exception in thread "main" java.lang.NoSuchMethodError”(线程“main”java.lang.NoSuchMethodError 出现异常)

“Exception in thread "main” java.lang.ExceptionInInitializerError”(线程“main”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 年前