фон:
Я запускаю искровую работу в огромном кластере с большими рабочими нагрузками, в котором постоянно находятся узлы с плохим состоянием, который получает задачу, отвечает на сердцебиение водителя, фактически не работает, и работает вечно, и может окончательно завершиться с ошибкой, так что водителю потребуется повторно отправить задачу в другое место.
что я сделал для работы с узлами в плохом состоянии:
Я устанавливаю 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)
. Но чтобы удалить исполнителя с помощью такой функции, я должен знать, какой исполнитель потерпел неудачу во время последнего задания.
Как это сделать?