

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# EMR Serverless 任務彈性
<a name="jobs-resiliency"></a>

 EMR Serverless 7.1.0 版和更新版本包含對任務彈性的支援，因此它會自動重試任何失敗的任務，而無需您進行任何手動輸入。任務彈性的另一個好處是，EMR Serverless 會在 AZ 遇到任何問題時，將任務執行移至不同的可用區域 (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 操作來取得任務的相關資訊。例如，搭配 `GetJobRun`操作使用 `attempt` 參數，以取得特定任務嘗試的詳細資訊。如果您未包含 `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 可以將這些日誌成功交付到 Amazon S3 和 Amazon CloudWatch，而不會覆寫任何日誌，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 只會將此字首格式用於所有串流任務和任何已啟用重試的批次任務。