繁体   English   中英

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

[英]How to terminate AWS EMR Cluster automatically after some time

我目前手头的任务是在一段时间后终止一个长时间运行的 EMR 集群(基于某些指标)。 Google Dataproc 在此处列出的“集群计划删除”中具有此功能: 集群计划删除

这在 EMR 上是可能的吗? 也许使用 Cloudwatch 指标? 或者我是否可以编写一个长时间运行的 jar,它将位于 EMR 主节点上,只轮询纱线以获取一些空闲时间指标,然后在设定的时间段后关闭集群?

编辑:更多说明。 我想要一些功能,其中集群基于空闲时间终止一些 x 时间。 例如,如果集群已经启动了一段时间,但在 1 小时内没有运行任何作业,并且集群只是坐在那里无所事事,那么我希望能够终止集群。

最简单的方法将用于Amazon EMR Metrics and Dimensions for Amazon CloudWatch 有一个isIdle布尔值“指示集群不再执行工作”。

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

成分:

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

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

另一种方法是:

  • 使用Amazon CloudWatch Events每隔x秒安排一次 Lambda 函数
  • Lambda 函数查找具有特定标签的任何集群,该标签指示要等待多长时间才能关闭(例如 40 分钟)。 如果标签不存在,则集群保持不变。
  • Lambda 函数查询集群状态(不知何故——可能通过 Hadoop API 调用),然后:
    • 如果集群空闲且没有Idle Since标签,则添加一个带有当前时间戳的Idle since标签
    • 如果集群空闲并且自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 事件/规则和 AWS Lambda 函数检查空闲 EMR 集群。 您可以在 AWS 控制台级别实现可见性,并且可以轻松启用和禁用它。

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

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

指定最大空闲时间阈值,AWS CloudWatch 事件/规则会触发一个 AWS Lambda 函数,该函数会查询所有处于 WAITING 状态的 AWS EMR 集群,并将当前时间与 AWS EMR 集群的就绪时间进行比较,以防目前未添加 EMR 步骤或将当前时间与 AWS EMR 集群的最后一步的结束时间进行比较。 如果阈值已被破坏,AWS EMR 将在启用终止保护后终止。 如果不是,它将跳过该 AWS EMR 集群。

AWS CloudWatch 事件/规则决定 AWS Lambda 函数检查空闲 AWS EMR 集群的频率。

您可以随时禁用AWS CloudWatch 事件/规则,只需单击一下即可禁用此框架,而无需删除其 AWS CloudFormation 堆栈。

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

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

注意:对我开发的此解决方案的任何贡献、改进和建议将不胜感激。

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

我不得不做一个类似的实现,仅仅考虑集群经过的时间并不能解决我们的问题。

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

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

所以这就是我们所做的,

  1. 请启动集群的用户添加一个 Tag,如“AutoShutDown”:“True:BufferMinutes”,这里“AutoShutDown”是键,“True:BufferMinutes”是 Tag 的值

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

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

  4. 现在

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

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

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

这种实现为用户提供了选择的灵活性,并减轻了开发运维的大量负担。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM