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

时间:2018-04-12 22:01:18

标签: amazon-web-services amazon-emr amazon-cloudwatch

我目前有一项任务是在一段时间后终止长时间运行的EMR集群(基于某个指标)。 Google Dataproc在此处列出了“群集预定删除”这一功能:https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/scheduled-deletion

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

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

3 个答案:

答案 0 :(得分:1)

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

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

组件:

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

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

另一种方法是:

  • 使用 Amazon CloudWatch Events 每隔 x 秒计划一次Lambda函数
  • Lambda函数会查找具有特定标记的任何群集,指示等待关闭的时间(例如40分钟)。如果标签不存在,则群集保持不变。
  • Lambda函数查询集群状态(以某种方式 - 可能通过Hadoop API调用),然后:
    • 如果群集处于空闲状态且没有 Idle Since 标记,请添加带有当前时间戳的 Idle Since 标记
    • 如果群集处于空闲状态,并且自 Idle Since 标记中的时间戳以来已超过 x 分钟,则终止群集。
    • 如果群集空闲,请删除 Idle Since 标记(如果存在)

答案 1 :(得分:0)

请紧记您在问题中提供的说明,可能有 3种可能的方式

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

2)使用 AWS CloudWatch事件/规则和AWS Lambda函数检查空闲的EMR集群。您可以在AWS控制台级别获得可见性,并可以轻松地启用和禁用它。 推荐

3)其他一些基于Shell的自定义解决方案,该解决方案针对EMR群集的主节点上的 CRON作业运行< / strong>,但您将无法在AWS Console级别上看到它,并且可能还需要SSH访问。

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

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

指定最大空闲时间阈值,并且AWS CloudWatch事件/规则触发一个AWS Lambda函数,该函数查询处于“等待”状态的所有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

对该解决方案的任何贡献,改进和建议,将受到高度赞赏。 :)

答案 2 :(得分:0)

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

所以我们想出了一种使用Hadoop API的方法,您可以在这里找到它们

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

这就是我们所做的

  1. 请问启动集群的用户添加诸如“ AutoShutDown”的标签:“ True:BufferMinutes”,此处“ AutoShutDown”是键,“ True:BufferMinutes”是标签的值

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

  3. 创建一个Lambda来打入配置了步骤1的所有那些集群的hadoop api(如果用户未添加Tag,则该集群未受影响)并获取上一个完成的作业的结束时间(仅当所有作业都已完成/终止时),如果任何作业仍在运行,则不执行任何操作并退出。

  4. 现在

    datetime_difference =(当前时间-lastFinished) if(datetime_difference>请求的时间) { Terminate_cluster }

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

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

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