Все операторы состояния Flink участвуют в одном и том же механизме контрольных точек.По указанию координатора контрольных точек (часть менеджера заданий) руководители задач запускают контрольную точку в каждом параллельном экземпляре каждого оператора источника.Источники проверяют свои смещения и вставляют барьер контрольных точек в поток.Это делит поток на части до и после контрольной точки.Барьеры проходят через график, и каждый оператор с состоянием проверяет свое состояние после обработки потока до барьера контрольной точки.Подробности описаны по ссылке, используемой @ bupt_ljy.
Таким образом, эти контрольные точки фиксируют все состояние распределенного конвейера, записывая смещения во входные очереди, а также состояние по всему графику заданий, возникшее в результате наличияпроглотил данные до этого момента.Когда происходит сбой, источники перематываются, состояние восстанавливается и обработка возобновляется.
Учитывая, что во время восстановления источники перематываются и воспроизводятся, «ровно один раз» означает, что состояние, управляемое Flink, затрагивается ровно один раз, а не то, что элементы потока обрабатываются ровно один раз.
В этом нет ничего особенного в окнах.В зависимости от типа применяемой оконной функции содержимое окна хранится в элементе управляемого ListState, ReducingState, AggregatingState или FoldingState.Когда элементы потока поступают и назначаются окну, они добавляются, уменьшаются, агрегируются или складываются в это состояние.Другие компоненты оконного API, в том числе Triggers и ProcessWindowFunctions, также могут иметь состояние с контрольной точкой.Например, CountTrigger
с использованием ReducingState для отслеживания того, сколько элементов было назначено окну, добавление одного к счетчику при добавлении каждого элемента в окно.
В случае, когда оконная функция имеет видProcessWindowFunction, все элементы, назначенные окну, сохраняются в состоянии Flink и передаются в итерируемой функции ProcessWindowFunction при запуске окна.Эта функция перебирает содержимое и выдает результат.Внутреннее состояние ProcessWindowFunction не является контрольной точкой;если задание не выполнено во время выполнения ProcessWindowFunction, задание возобновится с последней завершенной контрольной точки.Это будет включать в себя перемотку назад на время до того, как окно получит событие, которое вызвало срабатывание окна (это событие не может быть включено в контрольную точку, поскольку следующий за ней барьер контрольной точки может еще не иметь своего эффекта).Рано или поздно окно снова достигнет точки, когда оно будет запущено, и функция ProcessWindowFunction будет вызвана снова - с тем же содержимым окна, которое было получено в первый раз, - и, надеюсь, на этот раз оно не завершится с ошибкой.(Обратите внимание, что я проигнорировал случай окон времени обработки, которые не ведут себя детерминистически.)
Когда ProcessWindowFunction использует управляемое / контрольное состояние, оно используется для запоминания вещей между выстрелами, а не в пределах одногообжиг.Например, в окне, которое разрешает поздние события, может потребоваться сохранить ранее сообщенный результат, а затем выпустить обновление для каждого позднего события.