当所有步骤都完成时如何从Lambda终止EMR群集?

问题描述 投票:0回答:1

我试图弄清楚提交给它的所有步骤都为'COMPLETED'|'CANCELLED'|'FAILED'|'INTERRUPTED'后如何成功终止EMR群集。有三个Lambda函数。

  • Lambda 1:做一些工作并创建EMR。通过事件传递步骤和集群ID来触发Lambda 2。
  • Lambda 2:将从Lambda 1接收到的步骤提交到从该Lambda 1接收到的群集ID。
  • Lambda 3:提交最后一步,然后在所有步骤均为'COMPLETED'|'CANCELLED'|'FAILED'|'INTERRUPTED'时应发送终止请求。

我已经完成Lambda 3的步骤提交,但无法完成其余的操作。

我已经通过以下方式成功创建了EMR:

conn = boto3.client("emr")
cluster_id = conn.run_job_flow()

提交的步骤:

conn = boto3.client("emr")
action = conn.add_job_flow_steps(JobFlowId=cluster_id, Steps=event["steps"])

现在如何仅在给定条件下触发此终止?我看到了具有boto3 API docclient.terminate_job_flows(),但是此功能不会等待步骤完成或失败,而是直接触发终止过程。

当我完成所有步骤后,是否可以将KeepJobFlowAliveWhenNoStepsTRUE更改为FALSE?然后,我认为它应该自动关闭群集。但是通过API文档,一旦调用run_job_flow(),就找不到任何更改此参数的选项。

希望我能够传达我正确面对的问题。有帮助吗?

注意:在AWS Lambda中使用Python 3.8。每个步骤都是Spark作业。

python-3.x amazon-web-services aws-lambda amazon-emr aws-step-functions
1个回答
1
投票

我同意你的研究。最佳情况是将KeepJobFlowAliveWhenNoSteps设置为FALSE,以使群集自行终止。

我确实注意到RunJobFlow文档说:

如果KeepJobFlowAliveWhenNoSteps参数设置为TRUE,则集群将转换为WAITING状态,而不是在完成步骤后关闭。

因此,Lambda函数可以检查群集是否处于WAITING状态,如果是,则关闭群集。但是,这将需要反复检查。

可能可能提交最后的步骤,该步骤调用EMR API以关闭群集。这意味着集群有效地要求其终止,这是最后一步。 (我没有尝试过这个概念,但是这是执行关机的一种干净方法,而不必反复检查状态。)

关于此问题[How to terminate AWS EMR Cluster automatically after some time,也有关于关闭空闲集群的类似讨论

© www.soinside.com 2019 - 2024. All rights reserved.