Flink

Средний уровень

Почему моя задача Flink незаметно отбрасывает опоздавшие события?

Вотермарка — это собственное утверждение Flink, что больше не придёт событий старше заданного времени, а не измерение. Слишком агрессивная закрывает окно раньше, чем приходят реальные данные, без единой ошибки.

Читать на:
Без lateness allowedLateness + side output
Примерно сколько видимости каждый шаг добавляет к событиям, пришедшим после вотермарки — не измеренный бенчмарк.

Событие, пришедшее после того, как его окно уже сработало, не вызывает ошибку, не логируется и не повторяется — оно просто исчезает, а результат окна незаметно оказывается ниже реального.

Что на самом деле утверждает вотермарка

Вотермарка — это собственное утверждение Flink: «больше не придёт событий с временной меткой раньше T», которое и позволяет оконному оператору решить, что окно завершено, и выдать результат. Это утверждение, которое задача делает о данных на основе настроенной стратегии, а не прямое измерение, поэтому слишком агрессивная стратегия может утверждать завершённость раньше, чем реальные, ещё идущие данные на самом деле появятся.

Куда на самом деле деваются опоздавшие события

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

# держит окно открытым ещё 5 минут для опоздавших данных .window(...).allowedLateness(Time.minutes(5))

Side-output, которого у вас, скорее всего, нет

Даже с настроенным allowedLateness событие, пришедшее после того, как это расширенное окно наконец закрылось, всё равно отбрасывается. Направление его в поток .sideOutputLateData() вместо этого — даже просто чтобы считать объём и алертить на него — часто единственный способ реально узнать, сколько такого происходит, поскольку ничто в выходе основного пайплайна об этом не расскажет.

Посмотрите, как это выглядит на вашем собственном пайплайне.

Загрузите реальный event log Spark, run_results.json от dbt или экспорт метрик Flink — и получите конкретные рекомендации, которые нужно одобрить, а не ещё одно эмпирическое правило.