Savepoint vs Checkpoint в Apache Flink: сходства и отличия

Автор Категория ,
Savepoint vs Checkpoint в Apache Flink: сходства и отличия

Разбираемся с механизмами отказоустойчивости Flink-приложений. Что такое контрольные точки (Checkpoint), чем они отличаются от точек сохранения (Savepoint) и что между ними общего. А также при чем здесь snapshot, что выбирать в разных случаях и как это использовать для отказоустойчивости stateful-приложений Apache Flink.

Snapshot как механизм обеспечения отказоустойчивости приложений Apache Flink

Объединяя парадигмы пакетной и потоковой обработки данных для разработки stateful-приложений, Apache Flink позволяет обрабатывать как ограниченные, так и неограниченные потоки. В идеальном случае потоковые процессоры работают непрерывно. Но на практике любое приложение может какой-то момент выйти из строя. В случае stateful-приложения, когда вывод текущего события зависит от предыдущего, необходимо обеспечить сохранность состояния. Кроме аварийного завершения в случае сбоя, может возникнуть необходимость в обновлении потокового приложения, например, при развертывании новой версии в рабочей среде или исправления ошибок. Поэтому требуется способ восстановления состояния приложения и обеспечения его отказоустойчивости.

Для поддержки отказоустойчивости Flink делает моментальные снимки состояния заданий. Моментальный снимок (snapshot) – это непротиворечивый образ состояния задания Flink в определенный момент времени. Он является основой обеспечения отказоустойчивости и содержит состояние операторов в задании Flink, а также указатели смещения для каждого из источников данных. Процесс создания моментального снимка может запустить сам фреймворк или пользователь. Снимок, сделанный Flink автоматически для восстановления после сбоя, называется контрольной точкой (Checkpoint) и является внутренним механизмом восстановления приложения после сбоя. А snapshot, сделанный пользователями вручную с помощью API для обновления новой версии приложения, называется точкой сохранения (Savepoint). Это востребовано, когда потоковое приложение необходимо планово остановить для обновления или изменения базовой инфраструктуры.

Таким образом, моментальный снимок – это базовая концепция отказоустойчивости во Flink, который в зависимости от создателя становится контрольной точкой или точкой сохранения. Поэтому можно использовать оба варианта, чтобы сделать приложения Flink отказоустойчивыми на протяжении всего конвейера. С помощью контрольных точек и точек сохранения можно создать механизм резервного копирования для восстановления stateful или stateless приложения в случае сбоя или обновления. В случае сбоя выбирается последний снимок, и система восстанавливается с этой контрольной точки. Это гарантирует, что результат вычислений всегда можно последовательно восстановить. Контрольные точки создаются и управляются самим фреймворком, а точки сохранения – пользователем. Поэтому точку сохранения можно рассматривать как резервную копию выполненного процесса. Разобравшись с этими механизмами обеспечения отказоустойчивости Flink-приложений, рассмотрим каждый из них более подробно.

Контрольная точка

Чтобы сделать Flink-приложение отказоустойчивым, необходимо включить контрольную точку в его дизайн. В случае ошибки можно перезагрузить приложение с указанием состояния, используя автоматически сохраненный снимок потока данных. Контрольная точка улучшает отказоустойчивость Flink, позволяя приложению восстанавливать свое состояние и передавать поток в тот же момент времени, что и последний доступный на контрольной точке, в случае сбоя. По умолчанию механизм автогенерации контрольных точек отключен. Перед включением этой функции разработчику Flink-приложения стоит убедиться, что источник может воспроизводить записи в течение определенного времени подобно Apache Kafka или HDFS, а само хранилище состояний является постоянным типа HDFS. Включить контрольную точку во Flink можно с помощью параметра конфигурации env.enableCheckpointing(num), где env – это экземпляр StreamExecutionEnvironment, а num – интервал контрольной точки в миллисекундах. Объект конфигурации env.getCheckpointConfig() используется для настройки параметров контрольной точки. В отличие от точек сохранения, контрольные точки обычно нельзя переместить в другое место, поскольку они включать ссылки на абсолютные пути.

Концептуально точки сохранения Flink отличаются от контрольных точек так же, как резервные копии отличаются от журналов восстановления в традиционных системах баз данных. Основная цель контрольных точек – предоставить механизм восстановления в случае непредвиденных сбоев задания. Жизненный цикл контрольной точки управляется Flink, то есть контрольная точка создается, принадлежит и выпускается самим фреймворком без взаимодействия с пользователем. В качестве периодически запускаемого метода восстановления можно выделить две основные цели проектирования контрольных точек:

  • максимальная легкость реализации;
  • высокая скорость восстановления.

Чтобы достичь этих целей наиболее оптимальным путем, используются определенные свойства, например, код задания не меняется между попытками выполнения. Контрольные точки обычно удаляются после того, как задание было прекращено пользователем, кроме случаев, когда они явно настроены как сохраненные контрольные точки. В случае сбоя Flink восстанавливает приложение, загружая его состояние из контрольной точки и продолжая чтение с восстановленных позиций, как будто ничего не случилось.

Точка сохранения

Помимо контрольных точек, можно также создать точки сохранения выполненных заданий Flink. Они не не создаются автоматически, поэтому их следует активировать самостоятельно и установить каталог точки сохранения по умолчанию в конфигурационном YAML-файле flink-conf.yaml в свойстве state.savepoints.dir. При использовании JobManagerCheckpointStorage, метаданные и состояние точки сохранения будут храниться в файле _metadata.

Точки сохранения состоят из двух частей: каталога с большими двоичными файлами в стабильном хранилище типа Hadoop HDFS или AWS S3, а также относительно небольшого файла метаданных. Файлы в стабильном хранилище представляют собой чистые данные образа состояния выполнения задания. А файл метаданных точки сохранения содержит указатели на все файлы в стабильном хранилище, которые являются частью savepoint’а, в форме относительных путей.

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

Точка сохранения как моментальный снимок потокового приложения содержит информацию о точке ввода (входных данных), а также обо всех положениях источников и состоянии всего приложения. Получить такой согласованный снимок всего состояния, можно без остановки приложениея с помощью варианта алгоритма Чанди-Лэмпорта. С помощью savepoint’ов можно организовать повторную обработку данных, например, в следующих случаях:

  • развертывание обновленной версии потокового приложения, включая новую функцию, исправление ошибок или улучшенную ML-модель$
  • проведение A/B-тестирование, сравнение разных версий программы с использованием одних и тех же исходных потоков данных, запуск теста с одного и того же момента времени без ущерба для предыдущего состояния;
  • изменение масштаба приложения путем подключения новых ресурсов;
  • перевод потоковых приложений на новую версию фреймворка;
  • обновление самого приложения;
  • перенос приложений на другой кластер.

Savepoint vs Checkpoint: 3 главных различия

Итак, контрольные точки и точки сохранения – это два варианта создания моментальных снимков с состоянием потокового приложения Apache Flink. Хотя они основаны на одинаковом механизме, между ними можно выделить 3 основных отличия:

  • цель: контрольные точки являются встроенным механизмом восстановления приложений Apache Flink в случае сбоя сбоев задания. А назначение точек сохранения – быть способом перезапуска, продолжения или повторного открытия приостановленного приложения после резервного копирования вручную и возобновления активности пользователя.
  • реализация: контрольные точки спроектированы так, чтобы быть легкими и быстрыми, они могут использовать различные функции базового сервера состояния, чтобы оперативно восстановить данные в случае сбоя. Например, инкрементные контрольные точки с серверной частью состояния RocksDB используют внутренний формат этой высокопроизводительной NoSQL-СУБД вместо собственного формата Flink. Это ускоряет процесс их записи и чтения. И наоборот, точки сохранения уделяют больше внимания переносимости данных и поддержке любых изменений, внесенных в задание, что удорожает их создание и восстановление.
  • жизненный цикл: контрольные точки создаются фреймворком автоматически без взаимодействия с пользователем и носят периодический характер, чтобы обеспечить полное восстановление в случае неожиданного сбоя задания. А точками сохранения владеет и управляет пользователь, вручную их планируя, создавая и удаляя ненужные.

Таким образом, контрольные точки и точки сохранения – это две похожие, но разные функции обеспечения отказоустойчивости в Apache Flink, которые обслуживают отличные друг от друга потребности для согласованности и сохранения состояния приложения в случае неожиданных сбоев задания и запланированных остановок. Совместное использование этих двух механизмов позволяет разработчику Flink-приложения обеспечить его согласованность, сохранность и отказоустойчивость в разных сценариях и обстоятельствах.

Узнайте больше про администрирование и эксплуатацию Apache Flink для разработки распределенных приложений аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://nightlies.apache.org/flink/flink-docs-master/docs/ops/state/savepoints/
  2. https://www.ververica.com/blog/differences-between-savepoints-and-checkpoints-in-flink
  3. https://docs.cloudera.com/csa/1.2.0/flink-overview/topics/csa-checkpoint-savepoint.html
  4. https://harshit-sharma.medium.com/difference-between-snapshot-checkpoint-and-savepoint-in-apache-flink-57916f38ff47