Flink имеет две разные связанные абстракции, которые имеют дело с различными аспектами вычисления оконной аналитики для потоков с временными метками событий: водяные знаки и допустимая задержка.
Во-первых, водяные знаки, которые используются при работе с данными времени события (независимо от того, используете ли вы окна). Водяные знаки предоставляют Flink информацию о продвижении времени события и дают вам, разработчику приложения, средства борьбы с неупорядоченными данными. Водяные знаки текут вместе с потоком данных, и каждый из них отмечает позицию в потоке и содержит временную метку. Водяной знак служит подтверждением того, что в этой точке потока поток теперь (вероятно) завершен до этой отметки времени - или, другими словами, события, следующие за водяным знаком, вряд ли будут происходить раньше времени, указанного меткой времени. водяной знак. Наиболее распространенная стратегия водяных знаков - использовать BoundedOutOfOrdernessTimestampExtractor, который предполагает, что события прибывают с некоторой фиксированной ограниченной задержкой.
Теперь это дает определение задержки - события, которые следуют за водяным знаком с отметкой времени меньше, чем временная метка водяного знака, считаются поздними.
API окна предоставляет понятие допустимой задержки, которое по умолчанию установлено на ноль. Если допустимая задержка больше нуля, то триггер по умолчанию для окон времени событий будет принимать поздние события в соответствующие окна до предела допустимой задержки. Действие окна будет запускаться один раз в обычное время, а затем еще раз для каждого позднего события до конца разрешенного интервала задержки. После этого поздние события отбрасываются (или собираются на побочный выход, если он настроен).
How can I filter data stream as it wants to enter the window and check
if the data created at the right timestamp for the window?
Назначители окон Flink несут ответственность за присвоение событий соответствующим окнам - все будет происходить автоматически. При необходимости будут созданы новые экземпляры окон.
How can I gather such late data in a variable to do some processing on them?
Вы можете либо быть достаточно щедрыми в водяных знаках, чтобы избежать каких-либо поздних данных, и / или настроить допустимую задержку, чтобы она была достаточно длинной, чтобы учесть поздние события. Однако имейте в виду, что Flink будет вынужден держать открытыми все окна, которые все еще принимают поздние события, что задержит сбор мусора старых окон и может потреблять значительный объем памяти.
Обратите внимание, что в этом обсуждении предполагается, что вы хотите работать с временными окнами - например, окна длиной 8 мсек, с которыми вы работаете. Flink также поддерживает окна подсчета (например, групповые события в пакеты по 100), окна сеанса и настраиваемую логику окна. Водяные знаки и опоздание не играют никакой роли, например, если вы используете окна подсчета.
Если вы хотите получить результаты для каждой клавиши для своей аналитики, используйте keyBy для разделения потока по ключу (например, по userId) перед применением окон. Например
stream
.keyBy(e -> e.userId)
.timeWindow(Time.seconds(10))
.reduce(...)
будет выдавать отдельные результаты для каждого идентификатора пользователя.
Обновление: обратите внимание, что в последних версиях Flink теперь для окон можно собирать поздние события для побочного вывода.
Некоторая соответствующая документация:
Время события и водяные знаки
Допустимая задержка
person
David Anderson
schedule
16.07.2018