«Правильное» время в системах потоковой аналитики | OTUS

Курсы

Программирование
Microservice Architecture
-5%
React.js Developer
-4%
C++ Developer. Professional
-5%
Scala-разработчик
-8%
Backend-разработчик на PHP
-9%
Алгоритмы и структуры данных
-9%
Python Developer. Basic
-12%
Golang Developer. Professional
-5%
HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Java Developer. Professional Web-разработчик на Python MS SQL Server Developer Android Developer. Basic Разработчик программных роботов (RPA) на базе UiPath и PIX Highload Architect Reverse-Engineering. Professional Vue.js разработчик Node.js Developer Интенсив «Оптимизация в Java» Супер-практикум по использованию и настройке GIT Symfony Framework Java Developer. Basic Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Microservice Architecture
-5%
Экспресс-курс «IaC Ansible»
-10%
Administrator Linux.Basic
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Administrator Linux. Professional
-6%
Экcпресс-курс «ELK»
-10%
Экспресс-курс по управлению миграциями (DBVC)
-10%
Базы данных Network engineer Разработчик программных роботов (RPA) на базе UiPath и PIX Highload Architect Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

«Правильное» время в системах потоковой аналитики

Data_engineer_Deep_4.9-5020-b25165.png

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

Рассмотрим практический пример

У вас есть приложение (назовем его SaleWatch), которое считает, сколько заказов сделали пользователи на сайте в режиме реального времени. Данные поступают к вам потоком (например, через топик Apache Kafka), и ваше приложение разбивает этот поток на окна по 5 минут, считая сумму совершённых заказов за каждый интервал. Зачем? Например, по этой метрике можно будет понять, что произошел отказ сервиса, даже если технические метрики этого не покажут.

В 13:00 ваше приложение даёт сбой, падает и продолжает «лежать» на протяжении 3 часов (до 16:00), а данные в это время накапливались в очереди сообщений Kafka. Возникает проблема: если сейчас запустить приложение, то оно быстро считает накопившиеся данные из кафки, просуммирует, и на выходе метрика будет выглядеть так, словно все заказы за последние три часа были совершены за 5 минут с 16:00 до 16:05.

Как этого избежать?

Для решения проблемы нужно воспользоваться «альтернативным режимом времени» — event time. Давайте выясним, что это значит. Во многих фреймворках (включая такие распространенные, как Apache Spark и Apache Flink) есть два режима времени: 1. Processing Time — когда система обрабатывает отдельное событие, она опирается на текущее время, которое можно узнать у операционной системы. 2. Event Time — когда система обрабатывает событие, она опирается на время, указанное в самом событии (например, в поле timestamp).

Что это значит на практике:

  1. Если наше приложение SaleWatch работает в режиме processing time, то действительно оно будет думать, что все события, накопившиеся в очереди, появились только что, в момент их прихода. Оно положит их в первое же пятиминутное окно, и мы получим неправильную сумму (все заказы за три часа, когда приложение лежало, окажутся в показателях за первую пятиминутку с 16:00 до 16:05).
  2. Если наше приложение работает в режиме event time, то оно по времени событий поймет, что они относятся к предыдущим часам, когда оно лежало, распределит их по нужным окнам и посчитает по ним суммы корректно.

Почему бы всегда не использовать event time?

К сожалению, такая точность не достаётся бесплатно. Приложения в режиме event time потребляют больше ресурсов, чем в режиме processing time. Поэтому включать event time стоит только в тех приложениях, для которых точность критична.

У вас мог возникнуть вопрос — как же приложение в режиме event time понимает, что все данные пришли и можно закрывать окно, если оно не знает о реальном времени? Для этого используется механизм, называемый watermarks. О нём мы поговорим в следующих заметках.

Полезные ссылки: 1. Event time в документации Apache Flink 2. Event time в документации Apache Spark

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться