Улучшенная обработка выключения нод в Spark 3

Функция SPARK-20624 служит для повышения надежности и производительности Spark в случае использования Spot-нод. Перед остановкой спота shuffle-данные и содержимое кэша перемещаются, в результате чего влияние на работу Spark-приложения становится минимальным. Раньше, когда система "убивала" спот, shuffle-файлы полностью терялись, а значит, их надо было вычислять заново, то есть надо было заново выполнять потенциально долгие задачи. Но появилась новая фича, которая уже не требует настроек внешнего shuffle-сервиса, совместимого с Kubernetes (ну и, соответственно, отпала необходимость в запуске дорогих нод хранения).

Таким образом, можно сказать, что новая функция Spark: - выключает исполнитель постепенно и без потери данных; - предотвращает внезапное уничтожение спотов.

Но давайте разберем все более подробно:

  1. Исполнитель, подлежащий выключению, заносится в black list, в результате чего драйвер Spark больше не назначает ему новые задачи. При этом исполняемые задачи принудительно не прерываются, однако если они сбоят по причине остановки исполнителя, они перезапустятся в другом исполнителе.
  2. Кэшированные данные и Shuffle-файлы мигрируют из одного выключаемого исполнителя в другой. При этом если другого нет (к примеру, единственный исполнитель выключен), есть возможность настройки объектного хранилища (типа S3) в роли запасного.
  3. После того, как миграция завершится, исполнитель "умрет", а Spark-приложение продолжит работать как будто ничего не произошло.

Когда работает функция?

Это происходит в следующих случаях:

  1. При применении Spot/вытесняемых нод облачный провайдер уведомит о выключении за 60–120 сек. Spark способен использовать это время в целях сохранения важных shuffle-файлов. Такой механизм используется и тогда, когда экземпляр, находящийся на стороне провайдера, по каким-либо причинам выключают, к примеру, в случае обслуживания EC2.
  2. Если нода Kubernetes пустеет, допустим, для того же техобслуживания либо если вытесняется под Spark-исполнителя тем же более высокоприоритетным подом.
  3. Если убранный исполнитель -- это часть динамического выделения в случае уменьшения размера системы по причине простоя исполнителя. В вышеописанном случае, кстати, тоже будут сохранены как кэш, так и shuffle-файлы.

Как включить?

Функция включается посредством конфигурационных флагов. Надо включить 4 основных флага Spark:

Другие настройки, которые доступны, можно поискать непосредственно в исходном коде.

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

По материалам https://towardsdatascience.com/apache-spark-3-1-release-spark-on-kubernetes-is-now-generally-available-65cccbf1436b.