如何在所有步骤完成后从 Lambda 终止 EMR 集群?



我正在尝试弄清楚一旦提交到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(),但这个函数不会等待步骤完成或失败,而是直接点击终止过程。

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

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

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

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

我确实注意到RunJobFlow文档说:

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

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

可以提交调用 EMR API 以关闭集群的最后一步。这意味着集群实际上是在最后一步调用自己的终止。(我还没有尝试过这个概念,但这将是执行关机的干净方法,而无需重复检查状态。

关于关闭空闲集群,也有类似的讨论 这个问题:如何在一段时间后自动终止 AWS EMR 集群

最新更新