

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

# 何時在 CloudWatch 中設定 EMR 事件
<a name="emr-service-limits-cloudwatch-events"></a>

對於某些輪詢 APIs，例如 DescribeCluster、DescribeStep 和 ListClusters，設定 CloudWatch 事件可以縮短變更的回應時間，並釋放您的服務配額。例如，如果將 Lambda 函數設定為在叢集的狀態變更時執行，例如步驟完成或叢集終止時，您可以使用該觸發條件啟動工作流程中的下一個動作，而不是等待下一個輪詢。否則，如果您擁有專用的 Amazon EC2 執行個體或 Lambda 函數不斷輪詢 EMR API 是否發生變更，這不僅浪費運算資源，還可能達到服務配額。

以下是一些您可能會因移至事件驅動型架構而受益的情況。

## 案例 1：使用 DescribeCluster API 呼叫輪詢 EMR 以完成步驟
<a name="emr-service-limits-strategy-stepcompletion"></a>

**Example 使用 DescribeCluster API 呼叫輪詢 EMR 以完成步驟**  
常見的模式是向執行中的叢集提交步驟，然後輪詢 Amazon EMR 以取得有關步驟的狀態，通常使用 DescribeCluster 或 DescribeStep API。透過深入了解 Amazon EMR 步驟狀態變更事件，也可以在最短的延遲情況下完成此任務。  
此事件在其承載中包含下列資訊。  

```
{
  "version": "0",
  "id": "999cccaa-eaaa-0000-1111-123456789012",
  "detail-type": "EMR Step Status Change",
  "source": "aws.emr",
  "account": "123456789012",
  "time": "2016-12-16T20:53:09Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "severity": "ERROR",
    "actionOnFailure": "CONTINUE",
    "stepId": "s-ZYXWVUTSRQPON",
    "name": "CustomJAR",
    "clusterId": "j-123456789ABCD",
    "state": "FAILED",
    "message": "Step s-ZYXWVUTSRQPON (CustomJAR) in Amazon EMR cluster j-123456789ABCD (Development Cluster) failed at 2016-12-16 20:53 UTC."
  }
}
```
在細節貼圖中，Lambda 函數可以剖析 "state"、"stepId" 或 "clusterId"，以尋找相關資訊。

## 案例 2：輪詢 EMR 是否有可用叢集可執行工作流程
<a name="emr-service-limits-strategy-workflows"></a>

**Example 輪詢 EMR 是否有可用叢集可執行工作流程**  
對於執行多個叢集的客戶而言，應採取的模式是在叢集可用時立即在叢集上執行工作流程。如果有許多叢集正在執行，而且需要在等待的叢集上執行工作流程，則採取的模式可能是使用 DescribeCluster 或 ListClusters API 呼叫來輪詢 EMR 是否有可用叢集。在了解叢集何時準備好執行步驟時，另一種減少延遲的方法是處理 Amazon EMR 叢集狀態變更事件。  
此事件在其承載中包含下列資訊。  

```
{
  "version": "0",
  "id": "999cccaa-eaaa-0000-1111-123456789012",
  "detail-type": "EMR Cluster State Change",
  "source": "aws.emr",
  "account": "123456789012",
  "time": "2016-12-16T20:43:05Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "severity": "INFO",
    "stateChangeReason": "{\"code\":\"\"}",
    "name": "Development Cluster",
    "clusterId": "j-123456789ABCD",
    "state": "WAITING",
    "message": "Amazon EMR cluster j-123456789ABCD ..."
  }
}
```
對於此事件，可以設定 Lambda 函數，以便在叢集狀態變更為 WAITING 時，立即將等待中的工作流程傳送至叢集。

## 案例 3：輪詢 EMR 以進行叢集終止
<a name="emr-service-limits-strategy-clustertermination"></a>

**Example 輪詢 EMR 以進行叢集終止**  
執行許多 EMR 叢集的客戶常見模式是輪詢 Amazon EMR 是否存在已終止的叢集，以便不再將工作傳送至該叢集。可以使用 DescribeCluster 和 ListClusters API 呼叫或使用 Amazon EMR 叢集狀態變更事件來實作此模式。  
叢集終止時，發出的事件類似下列範例。  

```
{
  "version": "0",
  "id": "1234abb0-f87e-1234-b7b6-000000123456",
  "detail-type": "EMR Cluster State Change",
  "source": "aws.emr",
  "account": "123456789012",
  "time": "2016-12-16T21:00:23Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "severity": "INFO",
    "stateChangeReason": "{\"code\":\"USER_REQUEST\",\"message\":\"Terminated by user request\"}",
    "name": "Development Cluster",
    "clusterId": "j-123456789ABCD",
    "state": "TERMINATED",
    "message": "Amazon EMR Cluster jj-123456789ABCD (Development Cluster) has terminated at 2016-12-16 21:00 UTC with a reason of USER_REQUEST."
  }
}
```
承載的「詳細資訊」區段包括叢集 ID 和可對其執行動作的狀態。