我正在尝试弄清楚一旦提交到EMR集群的所有步骤都'COMPLETED'|'CANCELLED'|'FAILED'|'INTERRUPTED'
,如何成功终止EMR集群。有三个 Lambda 函数。
- Lambda 1:执行一些工作并创建 EMR。通过事件传递步骤和集群 ID 来触发 Lambda 2。 Lambda
- 2:将从 Lambda 1 接收的步骤提交到从该集群 ID 收到的集群 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 文档,它有client.terminate_job_flows()
,但这个函数不会等待步骤完成或失败,而是直接点击终止过程。
完成所有步骤后,有没有办法将KeepJobFlowAliveWhenNoSteps
从TRUE
更改为FALSE
?然后我认为它应该自动关闭集群。但是通过 API 文档,没有找到任何选项在调用run_job_flow()
后更改此参数。
希望我能够正确传达我面临的问题。有什么帮助吗?
注意:在 AWS Lambda 中使用 Python 3.8。每个步骤都是 Spark 作业。
我同意你的研究。最佳情况是将KeepJobFlowAliveWhenNoSteps
设置为FALSE
,以使群集自行终止。
我确实注意到RunJobFlow文档说:
如果
KeepJobFlowAliveWhenNoSteps
参数设置为TRUE
,则集群将转换为WAITING
状态,而不是在步骤完成后关闭。
因此,Lambda 函数可以检查集群是否处于WAITING
状态,如果是,则关闭集群。但是,这将需要反复检查。
可以提交调用 EMR API 以关闭集群的最后一步。这意味着集群实际上是在最后一步调用自己的终止。(我还没有尝试过这个概念,但这将是执行关机的干净方法,而无需重复检查状态。
关于关闭空闲集群,也有类似的讨论 这个问题:如何在一段时间后自动终止 AWS EMR 集群