

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

# 具有寬限期的 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 結構化串流中，其中運算涉及從外部資料來源讀取或寫入，突然關機可能會導致不需要的結果。串流任務處理微批次中的資料，並在中途中斷這些操作可能會導致後續嘗試中重複處理。當先前微批次的最新檢查點未寫入時，就會發生這種情況，導致串流任務重新啟動時再次處理相同的資料。這種重複處理不僅浪費運算資源，還可能影響業務營運，因此避免突然關機至關重要。

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>

任務會針對使用的運算資源計費，直到任務完全關閉為止，包括在寬限期內採取的任何時間。