如何在一段时间后自动终止 AWS EMR 集群

How to terminate AWS EMR Cluster automatically after some time

我目前手头有一项任务是在设定的时间段后(基于某些指标)终止 运行 宁 EMR 集群。 Google Dataproc 在 "Cluster Scheduled Deletion" 中列出了此功能:https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/scheduled-deletion

这在 EMR 上是可能的吗?也许使用 Cloudwatch 指标?或者我可以写一个长 运行ning jar 来放置在 EMR 主节点上,只轮询 yarn 的一些空闲时间指标,然后在一段时间后关闭集群吗?

编辑:更多说明。我想要一些功能,其中集群根据空闲时间终止。例如如果集群已经启动了一段时间,但没有工作 运行 比如说 1 小时并且集群只是坐在那里什么也不做,那么我希望能够终止集群。

最简单的方法就是Amazon EMR Metrics and Dimensions for Amazon CloudWatch。有一个 isIdle 布尔值 "indicates that a cluster is no longer performing work"。

您可以创建一个 CloudWatch 警报,说明如果它为 True 超过 x 分钟,然后触发警报。这会向 Amazon SNS 发送一条消息,这会触发 Lambda 函数来关闭集群。

组件:

  • Amazon CloudWatch 警报
  • 亚马逊 SNS 队列
  • AWS Lambda 函数

更新:这显然不合适(见下面的评论)。

另一种方法是:

  • 使用 Amazon CloudWatch Eventsx 秒安排一次 Lambda 函数
  • Lambda 函数 查找任何具有特定 标签 的集群,该标签指示等待关闭的时间(例如 40 分钟)。如果标签不存在,集群保持不变。
  • Lambda 函数查询集群状态(不知何故——可能通过 Hadoop API 调用),然后:
    • 如果集群空闲并且没有Idle Since标签,添加一个Idle Since标签,当前时间戳[=47] =]
    • 如果集群处于空闲状态并且自 Idle Since 标记中的时间戳以来已超过 x 分钟,则终止集群。
    • 如果集群空闲,删除Idle Since标签(如果存在)

牢记您在问题中提供的说明,可能有 3 种可能的方法

1) 使用 EMR 集群的 AWS CloudWatch 指标 isIdle。该指标跟踪集群是否处于活动状态,但不跟踪当前 运行 个任务。您可以将警报设置为在集群空闲一段时间后触发,例如三十分钟。 参考:https://docs.aws.amazon.com/emr/latest/ManagementGuide/UsingEMR_ViewingMetrics.html

2) 使用 AWS CloudWatch event/rule 和 AWS Lambda 函数 检查空闲的 EMR 集群。您可以在 AWS 控制台级别实现可见性,并可以轻松启用和禁用它。 推荐

3) 基于 Shell 的一些其他 自定义解决方案针对 CRON 作业运行 在 EMR 集群的 主节点 上,但您将失去其在 AWS 控制台级别的可见性,并且您可能还需要 SSH 访问权限。

使用第二种方法的解决方案:推荐

牢记这一点,我开发了一个小框架来使用上面提到的第二种解决方案来实现这一点。该框架是一个基于 AWS 的解决方案,使用 AWS CloudWatch 和 AWS Lambda 使用 Python 脚本,该脚本使用 Boto3 终止闲置了 AWS EMR 集群指定时间.

指定最大空闲时间阈值并且 AWS CloudWatch event/rule 触发一个 AWS Lambda 函数查询所有处于 WAITING 状态的 AWS EMR 集群,并为每个集群比较当前时间与 AWS EMR 集群的就绪时间(如果到目前为止没有添加 EMR 步骤)或将当前时间与 AWS EMR 集群的最后一步的结束时间进行比较。如果阈值已被破坏,AWS EMR 将在删除终止保护(如果启用)后终止。如果没有,它将跳过该 AWS EMR 集群。

AWS CloudWatch event/rule决定 AWS Lambda 函数检查空闲 AWS EMR 的频率集群.

您可以随时禁用 AWS CloudWatch event/rule 禁用此框架 单击一次而不删除其 AWS CloudFormation 堆栈。

AWS Lambda 函数 使用 Python 3.7 作为其运行时环境。

您可以从 GitHub 此处获取代码并使用它:https://github.com/abdullahkhawer/auto-terminate-idle-emr

非常感谢对此解决方案的任何贡献、改进和建议。 :)

我不得不做一个类似的实现,只是考虑集群运行时间并不能解决我们的问题。

所以我们想出了一个方法来访问 Hadoop API,你可以在这里找到它们

https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html#Cluster_Scheduler_API

这就是我们所做的,

  1. 请提出集群的用户添加一个类似"AutoShutDown":"True:BufferMinutes"的Tag,这里"AutoShutDown"是key,"True:BufferMinutes"是value标签

  2. 这里的 BufferMinutes 是以分钟为单位的时间(30、60 等)

  3. 创建一个 Lambda 来命中所有在步骤 1 中配置的集群的 hadoop api(如果用户不添加标签,则集群保持不变)并获取结束时间最后一个完成的工作(仅当所有工作都完成/终止时),如果任何工作仍在 运行ning 则什么都不做并退出。

  4. 现在

    datetime_difference = (current_time - lastFinished) 如果(datetime_difference > requested_time) { terminate_cluster }

  5. 创建一个云监视触发器并将创建为目标的 lambda 添加到其中,根据需要将触发器安排到 运行。

注意:Lambda 是用 python 编写的,因此使用了 boto3,客户端将是“emr”,就像 abdullahkhawer 在他上面的解决方案中提到的一样。

此实现为用户提供了选择的灵活性,并大大减轻了开发人员的负担。