使用作业重试策略 - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用作业重试策略

EMR在EKS版本 6.9.0 及更高版本的 Amazon 中,您可以为任务运行设置重试策略。重试策略会在作业驱动程序容器组(pod)失败或被删除时自动重新启动。这使得长时间运行的 Spark 流式传输作业在出现故障时更具弹性。

设置任务的重试策略

要配置重试策略,请使用提供一个RetryPolicyConfiguration字段。StartJobRunAPI此处显示了一个示例 retryPolicyConfiguration

aws emr-containers start-job-run \ --virtual-cluster-id cluster_id \ --name sample-job-name \ --execution-role-arn execution-role-arn \ --release-label emr-6.9.0-latest \ --job-driver '{ "sparkSubmitJobDriver": { "entryPoint": "local:///usr/lib/spark/examples/src/main/python/pi.py", "entryPointArguments": [ "2" ], "sparkSubmitParameters": "--conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=2 --conf spark.driver.cores=1" } }' \ --retry-policy-configuration '{ "maxAttempts": 5 }' \ --configuration-overrides '{ "monitoringConfiguration": { "cloudWatchMonitoringConfiguration": { "logGroupName": "my_log_group_name", "logStreamNamePrefix": "my_log_stream_prefix" }, "s3MonitoringConfiguration": { "logUri": "s3://amzn-s3-demo-logging-bucket" } } }'
注意

retryPolicyConfiguration仅从 AWS CLI 1.27.68 版本开始可用。要更新 AWS CLI 到最新版本,请参阅安装或更新最新版本的 AWS CLI

为此 maxAttempts 字段配置您希望在作业驱动程序容器组(pod)失败或被删除时重新启动的最大次数。两次作业驱动程序重试之间的执行间隔是指数重试间隔(10 秒、20 秒、40 秒...),上限为 6 分钟,如 Kubernetes 文档中所述。

注意

每增加一次任务驱动程序的执行都将作为另一次任务运行计费,并且将受 Amaz EMR on 的EKS定价限制。

重试策略配置值

  • 作业的默认重试策略:StartJobRun 包括默认情况下最大尝试次数设置为 1 的重试策略。您可以根据需要配置重试策略。

    注意

    如果 retryPolicyConfigurationmaxAttempts 设置为 1,则表示在失败时不会重试启动驱动程序容器组(pod)。

  • 禁用任务的重试策略:要禁用重试策略,请将中的最大尝试次数值设置 retryPolicyConfiguration 为 1。

    "retryPolicyConfiguration": { "maxAttempts": 1 }
  • maxAttempts 为有效范围内的任务设置:如果maxAttempts值超出有效范围,则StartJobRun调用将失败。有效 maxAttempts 范围介于 1 到 2147483647(32 位整数)之间,该范围受 Kubernetes 的 backOffLimit 配置设置支持。有关更多信息,请参阅 Kubernetes 文档中的 容器组(pod)回退失败策略。如果该 maxAttempts 值无效,则系统会返回以下错误消息:

    { "message": "Retry policy configuration's parameter value of maxAttempts is invalid" }

检索任务重试策略的状态

您可以使用和查看任务的重试状态ListJobRunsDescribeJobRunAPIs请求启用了重试策略配置的任务后,ListJobRunDescribeJobRun 响应将在 RetryPolicyExecution 字段中包含重试策略的状态。此外,DescribeJobRun 响应将包含在任务的 StartJobRun 请求中输入的 RetryPolicyConfiguration

示例响应

ListJobRuns response
{ "jobRuns": [ ... ... "retryPolicyExecution" : { "currentAttemptCount": 2 } ... ... ] }
DescribeJobRun response
{ ... ... "retryPolicyConfiguration": { "maxAttempts": 5 }, "retryPolicyExecution" : { "currentAttemptCount": 2 }, ... ... }

在禁用作业中的重试策略后,这些字段将不可见,如以下 重试策略配置值 中所述。

使用重试策略监控作业

启用重试策略后,会为创建的每个任务驱动程序生成一个 CloudWatch 事件。要订阅这些事件,请使用以下命令设置 CloudWatch 事件规则:

aws events put-rule \ --name cwe-test \ --event-pattern '{"detail-type": ["EMR Job Run New Driver Attempt"]}'

该事件将返回有关作业驱动程序的 newDriverPodNamenewDriverCreatedAt 时间戳、previousDriverFailureMessagecurrentAttemptCount 的信息。如果禁用重试策略,则不会创建这些事件。

有关如何通过 CloudWatch 事件监控作业的更多信息,请参阅通过 Amazon Events CloudWatch 监控作业

查找驱动程序和执行程序的日志

驱动程序 Pod 名称遵循格式 spark-<job id>-driver-<random-suffix>。相同的 random-suffix 会添加到驱动程序生成的执行程序 Pod 名称中。使用此 random-suffix 时,您可以找到驱动程序及其关联执行程序的日志。只有为任务启用了重试策略random-suffix 才会存在;否则,random-suffix 不会存在。

有关如何使用监控配置来配置任务以用于日志记录的更多信息,请参阅 运行 Spark 应用程序