Что такое окна агрегации в потоковой обработке данных?

«Что такое окна агрегации в потоковой обработке данных?» — вопрос из категории Потоковая обработка и Kafka, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основные типы окон:

  • Tumbling Window (Фиксированные/неперекрывающиеся окна): Окна фиксированной длины, которые не перекрываются. Каждое событие принадлежит ровно одному окну.

    -- Пример на SQL (Apache Flink)
    SELECT 
    user_id,
    TUMBLE_START(event_time, INTERVAL '1' HOUR) as window_start,
    COUNT(*) as event_count
    FROM user_clicks
    GROUP BY 
    user_id,
    TUMBLE(event_time, INTERVAL '1' HOUR)
  • Sliding Window (Скользящие/перекрывающиеся окна): Окна фиксированной длины, которые смещаются с заданным шагом (slide). Событие может попадать в несколько окон, если шаг меньше длины окна. Полезно для скользящих средних.

  • Session Window (Сессионные окна): Динамические окна, которые группируют события активности, разделенные периодами неактивности (timeout). Длина окна определяется данными.

Практическое применение в Kafka Streams/KsqlDB:

-- KsqlDB: Создание потока с 5-минутными tumbling windows
CREATE TABLE page_views_per_5min AS
  SELECT 
    page_id,
    COUNT(*) AS view_count,
    WINDOWSTART AS window_start,
    WINDOWEND AS window_end
  FROM page_views
  WINDOW TUMBLING (SIZE 5 MINUTES)
  GROUP BY page_id;

Ключевые параметры:

  • Размер окна (Size): Длительность (например, 5 минут) или количество событий.
  • Сдвиг/шаг (Slide/Advance): Насколько смещается окно (для sliding windows).
  • Задержка (Grace Period/Allowed Lateness): Время, в течение которого система ждет поздних данных перед финализацией результата окна.

В Kafka Streams я использовал эти окна для подсчета метрик в реальном времени, таких как количество ошибок в минуту или среднее время ответа API за 10-минутные интервалы.