我目前有一项任务是在一段时间后终止长时间运行的EMR集群(基于某个指标)。 Google Dataproc在此处列出了“群集预定删除”这一功能:https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/scheduled-deletion
这是EMR原生的可能吗?也许使用Cloudwatch指标?或者我可以编写一个长时间运行的jar,它将位于EMR主节点上,只是轮询一段空闲时间指标,然后在一段时间后关闭群集?
编辑:更多说明。我想要一些功能,其中基于空闲终止群集一段x时间。例如如果集群已经运行了一段时间但是工作已经运行了1个小时并且集群只是坐在那里什么都不做,那么我希望能够终止集群。
答案 0 :(得分:1)
最简单的方法将用于Amazon EMR Metrics and Dimensions for Amazon CloudWatch。有一个isIdle
布尔值“表示群集不再执行工作”。
您可以创建一个CloudWatch警报,指出如果它超过 x 分钟,则为True,然后触发警报。这会向Amazon SNS发送一条消息,该消息可以触发Lambda函数来关闭集群。
组件:
更新:这显然不合适(请参阅下面的评论)。
另一种方法是:
答案 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
这就是我们所做的
请问启动集群的用户添加诸如“ AutoShutDown”的标签:“ True:BufferMinutes”,此处“ AutoShutDown”是键,“ True:BufferMinutes”是标签的值>
此处的BufferMinutes是以分钟为单位的时间(30、60等)
创建一个Lambda来打入配置了步骤1的所有那些集群的hadoop api(如果用户未添加Tag,则该集群未受影响)并获取上一个完成的作业的结束时间(仅当所有作业都已完成/终止时),如果任何作业仍在运行,则不执行任何操作并退出。
现在
datetime_difference =(当前时间-lastFinished) if(datetime_difference>请求的时间) { Terminate_cluster }
创建一个云监视触发器,并向其添加作为目标创建的lambda,安排触发器按需运行。
注意:Lambda是用python编写的,因此使用了boto3,客户端将像上面的解决方案中的abdullahkhawer所说的一样“ emr”。
此实现为用户提供了选择的灵活性,并减轻了开发人员的负担。