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

h0m*_*mer 9 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 小时,并且集群只是坐在那里什么也不做,那么我希望能够终止集群。

Joh*_*ein 6

最简单的方法将用于 Amazon CloudWatch 的 Amazon EMR 指标和维度。有一个isIdle布尔值“表示集群不再执行工作”。

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

成分:

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

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

另一种方法是:

  • 使用Amazon CloudWatch Eventsx秒安排一次 Lambda 函数
  • lambda函数查找与某一特定的任何簇标记,表示要等待多长时间直到关机(如40分钟)。如果标签不存在,则集群保持不变。
  • Lambda 函数查询集群状态(不知何故——可能通过 Hadoop API 调用),然后:
    • 如果集群空闲并且没有Idle since标签,则添加一个带有当前时间戳的Idle since标签
    • 如果集群处于空闲状态并且自Idle since 标记中的时间戳起已超过x分钟,则终止集群。
    • 如果集群空闲,请删除Idle since标记(如果存在)

  • 试过了。这确实有效。使用 YARN rest api 获取作业列表以及它们运行的​​时间。然后我只需按作业的 DTG 排序并获取提交的最后一个作业。使用它和当前的 DTG,我可以启动另一种使用 AWS EMR SDK api 关闭 EMR 集群的方法。谢谢您的帮助。我只是希望亚马逊能像谷歌那样内置这个功能。由于与长时间运行的集群相关的成本,有一个空闲超时功能是有意义的,如果空闲时间超过一些 x 量,它会杀死集群。 (3认同)
  • 因此,在读入 Cloudwatch 警报(特别是 isIdle 指标)后,它说它仅每 5 分钟检查一次集群一次,并且仅当检查时它在特定时间空闲时才进行检查。这并不意味着在过去的整个 5 分钟内(在检查之前),集群是空闲的。我们安排的某些作业仅持续 3-4 分钟,因此有可能集群正在使用中,但在该作业完成后,“isIdle”检查仍会返回 true。有任何想法吗? (2认同)

abd*_*wer 6

请记住您在问题中提供的说明,可能有3 种可能的方法来做到这一点。

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

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

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

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

考虑到这一点,我开发了一个小框架来使用上面提到的第二个解决方案来实现这一点。该框架是一个基于 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

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