

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

# EMR Serverless 作业运行取消宽限期
<a name="job-cancellation-grace-period"></a>

在数据处理系统中，突然终止可能会导致资源浪费、操作不完整和潜在数据不一致。Amazon EMR Serverless 允许您在取消作业运行时指定宽限期。此功能允许在作业终止之前有时间进行适当的清理和完成正在进行的工作。

**注意**  
Amazon EMR 7.9.0 及更高版本支持此功能。

取消作业运行时，请使用参数 `shutdownGracePeriodInSeconds` 指定一个宽限期（以秒为单位），在此期间作业可以执行清理操作，然后再最终终止。批处理作业和流式处理作业的行为和默认设置有所不同。

## 批处理作业的宽限期
<a name="grace-period-batch-jobs"></a>

对于批处理作业，EMR Serverless 允许您实施在宽限期内执行的自定义清理操作。您可以将这些清理操作注册为应用程序代码中 JVM 关闭钩子的一部分。

**默认行为**

关闭的默认行为没有宽限期。它包含以下两个操作：
+ 立即终止
+ 资源立即释放

**配置选项**

您可以指定导致正常关闭的设置：
+ 关闭宽限期有效范围：15-1800 秒（可选）
+ 立即终止（没有任何宽限期）：0 秒

### 启用正常关闭
<a name="enable-graceful-shutdown-batch"></a>

要实现批处理作业的正常关闭，请按照以下步骤进行操作：

1. 在应用程序代码中添加包含自定义关闭逻辑的关闭钩子。

------
#### [ Example in Scala ]

   ```
   import org.apache.hadoop.util.ShutdownHookManager
   
   // Register shutdown hook with priority (second argument)
   // Higher priority hooks run first
   ShutdownHookManager.get().addShutdownHook(() => {
       logger.info("Performing cleanup operations...")
   }, 100)
   ```

   使用 [ShutdownHookManager](https://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-common/api/org/apache/hadoop/util/ShutdownHookManager.html)

------
#### [ Example in PySpark ]

   ```
   import atexit
   
   def cleanup():
       # Your cleanup logic here
       print("Performing cleanup operations...")
   
   # Register the cleanup function
   atexit.register(cleanup)
   ```

------

1. 指定取消作业时的宽限期，以便有时间执行之前添加的钩子

   **示例**

   ```
   # Default (immediate termination)
   aws emr-serverless cancel-job-run \
     --application-id {{APPLICATION_ID}} \
     --job-run-id {{JOB_RUN_ID}}
   
   # With 5-minute grace period
   aws emr-serverless cancel-job-run \
     --application-id {{APPLICATION_ID}} \
     --job-run-id {{JOB_RUN_ID}} \
     --shutdown-grace-period-in-seconds 300
   ```

## 流式处理作业的宽限期
<a name="grace-period-streaming-jobs"></a>

在 Spark Structured Streaming 中，计算涉及从外部数据来源读取数据或向其写入数据，突然关闭可能会导致不需要的结果。流式处理作业以微批次处理数据，而中途中断这些操作可能会导致后续尝试出现重复处理。当以前微批次中的最新检查点未写入时会发生这种情况，导致在流式处理作业重新启动时再次处理相同的数据。这种重复处理不仅浪费计算资源，还会影响业务运营，因此避免突然关闭至关重要。

EMR Serverless 通过流式查询侦听器提供内置正常关闭支持。这样可以确保在作业终止之前正确完成正在进行的微批次。该服务会自动管理流式处理应用程序的微批次之间的正常关闭，确保当前微批次完成处理，正确写入检查点，以及在关闭过程中无需提取新数据即可干净地终止流式处理上下文。

**默认行为**
+ 默认启用 120 秒宽限期。
+ 内置的流式查询侦听器管理正常关闭。

**配置选项**
+ 关闭宽限期有效范围：15-1800 秒（可选）
+ 立即终止：0 秒

### 启用正常关闭
<a name="enable-graceful-shutdown-streaming"></a>

要实现流式处理作业正常关闭，请执行以下操作：

指定取消作业时的宽限期，以便有时间完成正在进行的微批次。

**示例**

```
# Default graceful shutdown (120 seconds)
aws emr-serverless cancel-job-run \
  --application-id {{APPLICATION_ID}} \
  --job-run-id {{JOB_RUN_ID}}

# Custom grace period (e.g. 300 seconds)
aws emr-serverless cancel-job-run \
  --application-id {{APPLICATION_ID}} \
  --job-run-id {{JOB_RUN_ID}} \
  --shutdown-grace-period-in-seconds 300

# Immediate Termination
aws emr-serverless cancel-job-run \
  --application-id {{APPLICATION_ID}} \
  --job-run-id {{JOB_RUN_ID}} \
  --shutdown-grace-period-in-seconds 0
```

### 添加自定义关闭钩子（可选）
<a name="custom-shutdown-hooks"></a>

虽然默认情况下，EMR Serverless 通过其内置的流式查询侦听器管理正常关闭，但是您可以选择为单个流式查询实现自定义关闭逻辑。EMR Serverless 将其优雅关闭侦听器注册为优先级 60（使用）。 ShutdownHookManager由于优先级较高的钩子会优先运行，您可以注册优先级大于 60 的自定义清理操作，从而确保它们在 EMR Serverless 的关闭过程开始之前执行。

要添加自定义钩子，请参考本主题中的第一个示例，该示例展示了如何在应用程序代码中添加关闭钩子。这里，优先级为 100，大于 60。因此，此类关闭钩子会首先运行。

**注意**  
自定义关闭钩子是可选的，并非正常关闭功能所必需，EMR Serverless 会自动处理该功能。

### 宽限期费用和批处理持续时间
<a name="grace-period-charges"></a>

如果使用默认的宽限期值（120 秒）：
+ 如果您的批处理持续时间少于 120 秒，您只需支付完成批处理所需的实际时间费用。
+ 如果您的批处理持续时间超过 120 秒，则将按最大宽限期（120 秒）向您收费，但查询可能不会正常关闭，因为它将被强制终止。

要优化成本并确保正常关闭，请执行以下操作：
+ 对于持续时间超过 120 秒的批处理：考虑增加宽限期以匹配您的批处理持续时间。
+ 对于持续时间少于 120 秒的批处理：无需调整宽限期，因为您只需支付实际处理时间的费用。

## 注意事项
<a name="considerations"></a>

### 宽限期行为
<a name="grace-period-behavior"></a>
+ 宽限期为您注册的关闭钩子完成提供了时间。
+ 即使在宽限期之前，一旦关闭钩子完成，作业也会立即终止。
+ 如果清理作业超过宽限期，则该作业将被强制终止。

### 服务行为
<a name="service-behavior"></a>
+ 宽限期关闭仅适用于处于 RUNNING 状态的作业。
+ CANCELLING 状态下的后续取消请求将被忽略。
+ 如果 EMR Serverless 由于内部服务错误而无法启动宽限期关闭：
  + 服务将重试最多 2 分钟。
  + 如果重试不成功，则作业将被强制终止。

### 计费
<a name="billing"></a>

作业将按作业完全关闭之前所使用的计算资源计费，包括在宽限期内花费的任何时间。