искра - как узнать, какой исполнитель потерпел неудачу во время выполнения задания и избежать их? - PullRequest
0 голосов
/ 11 ноября 2018

фон:

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

что я сделал для работы с узлами в плохом состоянии:

Я устанавливаю spark.blacklist.enabled на True, чтобы убедиться, что повторно отправленная задача уходит куда-то еще (и в мгновение ока завершена). Однако, как я выяснил в журнале, черный список работает только для одного этапа:

Blacklisting executor 28 for stage 0

так что на следующей стадии, безусловно, снова попробуют больной узел, и есть большая вероятность, что больной узел может не вернуться в нормальное состояние. Я только что столкнулся с такой ситуацией, что узел продолжает не справляться с задачей в течение 48 часов 180 раз и просто убивает себя окончательно.

18/11/11 19:47:26 WARN cluster.YarnSchedulerBackend$YarnSchedulerEndpoint: Container marked as failed: container_1534870268016_1640615_01_000051 on host: ill-datanode. Exit status: -100. Diagnostics: Container released on a *lost* node

Исполнитель, подобный этому, сильно снижает производительность приложения.

поэтому я придумываю план Б: я сам его убиваю

Я обнаружил, что есть 2 функции для управления исполнителем, которые называются SparkSession.sparkContext.killExecutor(executorId: String) и requestExecutors(numAdditionalExecutors: Int). Но чтобы удалить исполнителя с помощью такой функции, я должен знать, какой исполнитель потерпел неудачу во время последнего задания.

Как это сделать?

...