

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

# EMR Serverless 作业弹性
<a name="jobs-resiliency"></a>

 EMR Serverless 7.1.0 及更高版本包含对作业弹性的支持，可自动重试任何失败的作业，而无需任何手动输入。作业弹性的另一个好处是，如果一个可用区（AZ）出现任何问题，EMR Serverless 会将作业运行转移到其他可用区（AZ）。

要为作业启用作业弹性，请设置作业的重试策略。重试策略可确保 EMR Serverless 在作业失败时自动重启作业。批处理和流处理作业均支持重试策略，因此请根据自己的使用案例自定义作业弹性。下表对比了批处理和流处理作业在作业弹性方面的行为和差异。


|  | 批处理作业 | 流处理作业 | 
| --- | --- | --- | 
| 默认 行为 | 不重新运行作业。 | 始终重试运行作业，因为应用程序会在运行作业时创建检查点。 | 
| 重试点 | 批处理作业没有检查点，因此 EMR Serverless 总是从头开始重新运行作业。 | 流处理作业支持检查点，因此请配置流查询，将运行时状态和进度保存到 Amazon S3 中的检查点位置。EMR Serverless 从检查点恢复作业运行。有关更多信息，请参阅 Apache Spark 文档中的[使用检查点从故障中恢复](https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#recovering-from-failures-with-checkpointing)。 | 
| 最大重试次数 | 最多允许重试 10 次。 | 流处理作业具有内置的防抖动控制，因此如果作业在一小时后继续失败，应用程序将停止重试作业。一小时内的默认重试次数为 5 次。您可以将重试次数配置为 1 或 10 之间。无法自定义最大尝试次数。值为 1 表示不重试。 | 

当 EMR Serverless 尝试重新运行作业时，还会使用尝试编号对该作业编制索引，以便跟踪作业尝试期间的生命周期。

使用 EMR Serverless API 操作或 AWS CLI 更改工作弹性或访问与工作弹性相关的信息。有关更多信息，请参阅 [EMR Serverless API 指南](https://docs.aws.amazon.com/emr-serverless/latest/APIReference/Welcome.html)。

默认情况下，EMR Serverless 不会重新运行批处理作业。要启用批处理作业重试，请在开始批处理作业运行时配置 `maxAttempts` 参数。`maxAttempts` 参数仅适用于批处理作业。默认值为 1，表示不重新运行作业。可接受的值为 1 到 10（含）。

以下示例演示了如何在启动作业运行时指定最多尝试 10 次。

```
aws emr-serverless start-job-run
 --application-id <APPLICATION_ID> \
 --execution-role-arn <JOB_EXECUTION_ROLE> \
 --mode 'BATCH' \
 --retry-policy '{
    "maxAttempts": 10
 }' \
 --job-driver '{
    "sparkSubmit": {
         "entryPoint": "/usr/lib/spark/examples/jars/spark-examples-does-not-exist.jar",
         "entryPointArguments": ["1"],
         "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi"
     }
}'
```

如果流处理作业失败，EMR Serverless 会无限期重试。要防止因重复出现无法恢复的故障而导致中断，可使用 `maxFailedAttemptsPerHour` 为流处理作业重试配置防抖动控制。通过该参数，您可以指定在 EMR Serverless 停止重试前一小时内允许的最大失败尝试次数。默认为 5 次。可接受的值为 1 到 10（含）。

```
aws emr-serverless start-job-run
 --application-id <APPPLICATION_ID> \
 --execution-role-arn <JOB_EXECUTION_ROLE> \
 --mode 'STREAMING' \
 --retry-policy '{
    "maxFailedAttemptsPerHour": 7
 }' \
 --job-driver '{
    "sparkSubmit": {
         "entryPoint": "/usr/lib/spark/examples/jars/spark-examples-does-not-exist.jar",
         "entryPointArguments": ["1"],
         "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi"
     }
}'
```

您还可以使用其他作业运行 API 操作来获取有关作业的信息。例如，将 `attempt` 参数与 `GetJobRun` 操作一起使用，以获取有关特定作业尝试的详细信息。如果不包含 `attempt` 参数，该操作将返回有关最新尝试的信息。

```
aws emr-serverless get-job-run \
    --job-run-id job-run-id \
    --application-id application-id \
    --attempt 1
```

`ListJobRunAttempts` 操作将返回与作业运行相关的所有尝试的信息。

```
aws emr-serverless list-job-run-attempts \
  --application-id application-id \
  --job-run-id job-run-id
```

该`GetDashboardForJobRun`操作创建并返回一个 URL， UIs 用于访问应用程序以运行作业。`attempt` 参数允许您获取特定尝试的 URL。如果不包含 `attempt` 参数，该操作将返回有关最新尝试的信息。

```
aws emr-serverless get-dashboard-for-job-run \
    --application-id application-id \
    --job-run-id job-run-id \
    --attempt 1
```

## 使用重试策略监控作业
<a name="SECTION-jobs-resiliency-monitor-retry-policy"></a>

作业弹性支持还添加了新事件 **EMR Serverless 作业运行重试**。EMR Serverless 在每次重试作业时都会发布此事件。您可以使用此通知跟踪作业的重试次数。有关事件的更多信息，请参阅 [Amazon EventBridge 事件](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events.html)。

## 使用重试策略记录日志
<a name="SECTION-jobs-resiliency-log-retry-policy"></a>

每次 EMR Serverless 重试作业时，都会生成自己的日志集。为了确保 EMR Serverless 能够在不覆盖任何日志 CloudWatch 的情况下成功将这些日志传送到 Amazon S3 和 Amazon，EMR Serverless 在 S3 日志路径和 CloudWatch 日志流名称的格式中添加了一个前缀，以包含任务的尝试次数。

下面是该格式的一个示例。

```
'/applications/<applicationId>/jobs/<jobId>/attempts/<attemptNumber>/'.
```

这种格式可确保 EMR Serverless 将每次尝试执行任务的所有日志发布到自己在 Amazon S3 中的指定位置和。 CloudWatch有关更多详细信息，请参阅[存储日志](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/logging.html)。

**注意**  
EMR Serverless 仅对所有流处理作业和任何启用重试的批处理作业使用此前缀格式。