何时在 CloudWatch 中设置 EMR 事件
对于某些轮询 API,比如 DescribeCluster、DescribeStep 和 ListClusters,设置 CloudWatch 事件可以缩短对更改的响应时间并释放服务配额。例如,如果您将 Lambda 函数设置为在集群状态更改时运行(例如步骤完成或集群终止时),则可以使用该触发器启动工作流中的下一个操作,而不是等待下一次轮询。否则,如果您有专用的 Amazon EC2 实例或 Lambda 函数不断轮询 EMR API 以进行更改,您不仅会浪费计算资源,还可能会达到您的服务配额。
以下是您可以通过迁移到事件驱动架构而受益的几个案例。
案例 1:使用 DescribeCluster API 调用轮询 EMR 以完成步骤
例 使用 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 获取可用集群以运行工作流
例 轮询 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 以终止集群
例 轮询 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." } }
负载的“详细信息”部分包括可对其执行操作的 clusterId 和状态。