Как отключить кластер EMR от Lambda, когда все шаги ЗАВЕРШЕНЫ? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь понять, как я могу успешно завершить работу кластера 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.

1 Ответ

1 голос
/ 29 мая 2020

Я согласен с вашим исследованием. Оптимальной ситуацией было бы установить KeepJobFlowAliveWhenNoSteps на FALSE, чтобы кластер самозавершался.

Я заметил, что в документации RunJobFlow написано:

Если для параметра KeepJobFlowAliveWhenNoSteps установлено значение TRUE, кластер переходит в состояние WAITING, а не завершает работу после завершения шагов.

Следовательно, лямбда-функция может проверить находится ли кластер в состоянии WAITING, и если да, выключите кластер. Однако это потребует повторной проверки.

Возможно, возможно, отправить последний шаг, который вызывает API EMR для завершения работы кластера. Это означает, что кластер фактически вызывает собственное завершение в качестве последнего шага. (Я не пробовал эту концепцию, но это был бы чистый способ выполнить выключение без необходимости многократно проверять статус.)

По этому вопросу также есть аналогичное обсуждение выключения неактивных кластеров: Как завершить работу AWS Кластер EMR автоматически через некоторое время

...