Почему задание spark-submit покидает процесс, запущенный на главном узле кластера (EMR)?

#apache-spark #amazon-emr #livy

#apache-spark #amazon-emr #ливи

Вопрос:

Я отправляю задание spark в Livy с помощью функции AWS lambda. Задание выполняется до конца программы драйвера, но затем не завершается.

Если spark.stop() или sc.stop() добавлены в конец программы драйвера, задание spark завершается в диспетчере ресурсов YARN, и Livy сообщит об успешном завершении. Однако на главном узле все еще выполняется процесс livy, который занимает около 1,5 Гб памяти. Если отправлено много заданий, это в конечном итоге использует и удерживает всю память главного узла.

Задание:

  • Извлекает записи из таблицы hive

  • Собирает эти записи на главном узле и затем записывает их в PDF-файл с помощью apache pdfbox

  • Загружает полученный PDF-файл в S3

Прямой запуск spark-submit в кластере приводит к тем же результатам, однако, если я нажму ctrl c во время выполнения задания spark-submit, процесс на главном узле завершается.

Мы ожидаем, что задание завершится само по себе при достижении конца программы драйвера. Если это не так, при вызове spark.stop() должен вызываться перехват завершения работы.

Комментарии:

1. Я уверен, что вы либо нашли решение, либо продвинулись дальше, но у меня была аналогичная проблема. В моем случае задание spark выполняло запись в очередь aws, которая возвращала Java future, а future не было завершено до завершения задания (context.stop () и т.д.), Поэтому программа драйвера зависала. Как только я переключился на блокирующий вызов, все сработало так, как ожидалось. надеюсь, это даст вам некоторые подсказки

Ответ №1:

вы пытались включить этот флаг в конфигурациях spark? spark.yarn.submit.waitAppCompletion=false

Я заметил, что livy выполняет команду spark-submit. И указанный выше флаг гарантирует, что команда завершится, как только приложение yarn создаст идентификатор приложения