Я пытаюсь понять, как я могу успешно завершить работу кластера EMR после того, как все отправленные ему шаги будут 'COMPLETED'|'CANCELLED'|'FAILED'|'INTERRUPTED'
. Есть три лямбда-функции.
- Лямбда 1: Выполняет некоторую работу и создает EMR. Запускает лямбда 2, передавая шаги и идентификатор кластера через событие.
- Лямбда 2: отправляет шаги, полученные от лямбда 1, в идентификатор кластера, полученный от того же.
- Лямбда 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 выполняет c, у которого есть client.terminate_job_flows()
, но эта функция не дожидается завершения шагов sh или сбоя и напрямую попадает в процесс завершения.
Есть ли способ изменить KeepJobFlowAliveWhenNoSteps
с TRUE
на FALSE
, когда все мои шаги будут выполнены? Тогда думаю он должен автоматически выключить кластер. Но, следуя документации API, я не нашел никакой возможности изменить этот параметр после вызова run_job_flow()
.
Надеюсь, я смог правильно передать проблему, с которой столкнулся. Любая помощь?
Примечание: используется Python 3,8 дюйма AWS лямбда. Каждый шаг - это задание Spark.