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

How to terminate an EMR Cluster from Lambda when all Steps are COMPLETE?

我想弄清楚一旦提交给它的所有步骤都是 'COMPLETED'|'CANCELLED'|'FAILED'|'INTERRUPTED',我如何才能成功终止 EMR 集群。共有三个 Lambda 函数。

我已经完成了 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 doc里面有client.terminate_job_flows(),但是这个函数不等待步骤完成或失败,直接命中终止进程。

有没有办法在我完成所有步骤后将 KeepJobFlowAliveWhenNoStepsTRUE 更改为 FALSE?然后我认为它应该自动关闭集群。但是根据 API 文档,在调用 run_job_flow() 后没有找到任何更改此参数的选项。

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

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

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

我确实注意到 RunJobFlow 文档说:

If the KeepJobFlowAliveWhenNoSteps parameter is set to TRUE, the cluster transitions to the WAITING state rather than shutting down after the steps have completed.

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

可能 提交调用 EMR API 关闭集群的最后一步。这意味着集群正在有效地调用自己的终止作为最后一步。 (我还没有尝试过这个概念,但这将是一种无需重复检查状态即可执行关机的干净方式。)

在这个问题上也有类似的关于关闭空闲集群的讨论: