

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

# 使用作业重试策略
<a name="jobruns-using-retry-policies"></a>

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

## 设置任务的重试策略
<a name="setting-retry-policy"></a>

要配置重试策略，您需要使用 [StartJobRun](https://docs.aws.amazon.com/emr-on-eks/latest/APIReference/API_StartJobRun.html)API 提供一个`RetryPolicyConfiguration`字段。此处显示了一个示例 `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](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)

为此 `maxAttempts` 字段配置您希望在作业驱动程序容器组（pod）失败或被删除时重新启动的最大次数。两次作业驱动程序重试之间的执行间隔是指数重试间隔（10 秒、20 秒、40 秒...），上限为 6 分钟，如 [Kubernetes 文档](https://kubernetes.io/docs/concepts/workloads/controllers/job/#pod-backoff-failure-policy)中所述。

**注意**  
每额外执行一次作业驱动程序都将作为另一次作业运行进行计费，并根据 [Amazon EMR on EKS 定价](https://aws.amazon.com/emr/pricing/#Amazon_EMR_on_Amazon_EKS)而定。

### 重试策略配置值
<a name="retry-config"></a>
+ **作业的默认重试策略：**`StartJobRun` 包括默认情况下最大尝试次数设置为 1 的重试策略。您可以根据需要配置重试策略。
**注意**  
如果 `retryPolicyConfiguration` 的 `maxAttempts` 设置为 1，则表示在失败时不会重试启动驱动程序容器组（pod）。
+ **禁用任务的重试策略：**要禁用重试策略，请将中的最大尝试次数值设置 retryPolicyConfiguration 为 1。

  ```
  "retryPolicyConfiguration": {
      "maxAttempts": 1
  }
  ```
+ **在有效范围内为作业设置 maxAttempts：**如果 `maxAttempts` 值超出有效范围，则 `StartJobRun` 调用将失败。有效 `maxAttempts` 范围介于 1 到 2147483647（32 位整数）之间，该范围受 Kubernetes 的 `backOffLimit` 配置设置支持。有关更多信息，请参阅 Kubernetes 文档中的 [容器组（pod）回退失败策略](https://kubernetes.io/docs/concepts/workloads/controllers/job/#pod-backoff-failure-policy)。如果该 `maxAttempts` 值无效，则系统会返回以下错误消息：

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

## 检索任务重试策略的状态
<a name="retrieve-policy"></a>

您可以使用和查看任务的重试状态[https://docs.aws.amazon.com/emr-on-eks/latest/APIReference/API_ListJobRuns.html](https://docs.aws.amazon.com/emr-on-eks/latest/APIReference/API_ListJobRuns.html)。[https://docs.aws.amazon.com/emr-on-eks/latest/APIReference/API_DescribeJobRun.html](https://docs.aws.amazon.com/emr-on-eks/latest/APIReference/API_DescribeJobRun.html) APIs请求启用了重试策略配置的任务后，`ListJobRun` 和 `DescribeJobRun` 响应将在 `RetryPolicyExecution` 字段中包含重试策略的状态。此外，`DescribeJobRun` 响应将包含在任务的 `StartJobRun` 请求中输入的 `RetryPolicyConfiguration`。

**示例响应**

------
#### [ ListJobRuns response ]

```
{
  "jobRuns": [
    ...
    ...
    "retryPolicyExecution" : {
      "currentAttemptCount": 2
    }
    ...
    ...
  ]
}
```

------
#### [ DescribeJobRun response ]

```
{
  ...
  ...
  "retryPolicyConfiguration": {
    "maxAttempts": 5
   },
   "retryPolicyExecution" : {
    "currentAttemptCount": 2
  },
  ...
  ...
}
```

------

在禁用作业中的重试策略后，这些字段将不可见，如以下 [重试策略配置值](#retry-config) 中所述。

## 使用重试策略监控作业
<a name="monitoring-retry"></a>

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

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

该事件将返回有关作业驱动程序的 `newDriverPodName`、`newDriverCreatedAt` 时间戳、`previousDriverFailureMessage` 和 `currentAttemptCount` 的信息。如果禁用重试策略，则不会创建这些事件。

有关如何通过 CloudWatch 事件监控作业的更多信息，请参阅[通过 Amazon Events CloudWatch 监控作业](monitoring.md#monitoring-cloudwatch-events)。

## 查找驱动程序和执行程序的日志
<a name="finding-logs"></a>

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

有关如何使用监控配置来配置任务以用于日志记录的更多信息，请参阅 [运行 Spark 应用程序](getting-started.md#getting-started-run-spark-app)。