Путешествуем во времени и пользовательском пространстве с Apache Kafka Streams

Kafka, Big Data, Большие данные, архитектура, обработка данных, Кафка Стримс

В этой статье мы продолжим говорить про основы Apache Kafka Streams для начинающих и рассмотрим одно из самых важных свойств Кафка – возможность обработки любых данных, накопленных с начала работы Big Data системы.

Что такое окна Apache Kafka Streams и зачем они нужны

Кафка обеспечивает объективную достоверность накопленных исторических данных благодаря сохранению сообщений на диске в журнале и их реплицированию по узлам кластера [1]. На практике очень часто возникает задача выбора только определенных данных из всего объема информации, накопленного от запуска Big Data системы по настоящий момент. К примеру, требуется определить количество биржевых операций, проведенных с акциями конкретной компании за последние 10 минут, или число пользователей, кликнувших на новый рекламный баннер в течение четверти часа. В терминологии Apache Kafka такие заданные промежутки времени называются окнами [2].

Окна позволяют группировать нужные записи с одинаковым ключом для операций с сохранением состояния (stateful). Окна отслеживаются по ключу записи, чтобы обеспечить правильное разбиение данных («ключ») для последующих операций. После первичной агрегации по ключу возможно дополнительно группировать нужные записи. Например, в операциях объединения (join) оконное хранилище состояний (windowing state store) используется для хранения всех записей, полученных в пределах определенной границы этого окна. В операциях агрегирования оконное хранилище состояний используется для хранения последних результатов агрегации каждого окна. Старые записи в хранилище состояний удаляются по истечении указанного срока хранения окна. Kafka Streams гарантирует сохранение окна хотя бы на указанное время; значение по умолчанию составляет один день и может быть изменено с помощью методов Windows#until() и SessionWindows#until() [3].

В Kafka Streams существует 3 типа окон [2]:

  • сеансовые (session), которые отражают интервалы активности и ограничиваются периодами бездействия пользователя, приложения, сервиса или другой активной сущности, поведение которой требуется отслеживать;
  • кувыркающиеся (tumbling), которые захватывают события, попадающие в определенный промежуток времени. Например, все биржевые транзакции заданной компании каждые 20 секунд, по окончании которых окно «кувыркается» и переходит на новый 20-секундный интервал наблюдения;
  • скользящие (sliding) и прыгающие (hopping), которые не ждут окончания интервала времени перед созданием нового окна для обработки недавних событий, а запускают новые вычисления после интервала ожидания, меньшего чем длительность окна. Например, требуется подсчитывать число биржевых транзакций каждые 20 секунд, но обновлять счетчик — каждые 5 секунд.

Сеансовые окна Apache Kafka Streams

Отметим, что сеансовые окна, хотя и основаны не на времени, а на действиях пользователей, все же применяют временные метки (дата и время) записи для идентификации ее сеанса. Сеансовые окна, разделяемые коротким периодом бездействия, объединяются в более крупный сеанс. При поступлении записей выполняется поиск уже существующих сеансов с тем же ключом, временем окончания меньше, чем разность текущей временной метка и интервала бездействия и временем начала больше, чем сумма текущей временной метки и интервала бездействия [2]. Если событие выходит за пределы промежутка между сеансами, то будет создан новый сеанс. Сеансовые окна отличаются от других типов тем, что [3]:

  • все окна отслеживаются независимо по ключам — например, окна разных ключей обычно имеют разное время начала и окончания
  • размеры их окон различаются — даже окна для одного и того же ключа обычно имеют разные размеры

Основная область применения сеансовых окон – анализ поведения пользователей, например, подсчет количества посещений на сайте или реализация конверсионной воронки и потоков событий. Определить сеансовое окно с интервалом бездействия 5 минут можно с помощью готового метода высокоуровневого DSL (Domain Specific Language) Apache Kafka Streams: SessionWindows.with(TimeUnit.MINUTES.toMillis(5)) [3].

session window, Кафка Стримс, Apache Kafka Streams, Кафка Стримс, поточная обработка данных во временном периоде, сеансовое окно
5-минутное сеансовое окно Kafka Streams

Кувыркаемся, скользим и прыгаем в динамические окна Кафка Стримс: tumbling, sliding, hopping windows

В отличие от сеансовых окон, все эти 3 типа основаны на временных периодах, а не на действиях активной сущности, происходящих в заданные промежутки. Несмотря на похожий принцип работы, кувыркающиеся (tumbling), скользящие (sliding) и прыгающие (hopping) окна существенно отличаются друг от друга. Кувыркающиеся окна дают представление о событиях в рамках заданного периода времени, при этом события не перекрываются, в отличие от прыгающих окон, которые часто обновляются и могут содержать пересекающиеся (повторяющиеся) записи [2].

Для определения кувыркающегося окна также существует готовый DSL-метод Kafka Streams. Например, создать 5-минутное окно типа tumbling можно с помощью следующей инструкции: TimeWindows.of(TimeUnit.MINUTES.toMillis(5)) [3].

tumbling window, Кафка Стримс, Apache Kafka Streams, Кафка Стримс, поточная обработка данных во временном периоде, кувыркающееся окно
5-минутное кувыркающееся окно Kafka Streams

Отметим, что в Kafka Streams скользящие окна используются только для операций объединения (join) и могут быть определены через класс JoinWindows. При этом моделируется окно фиксированного размера, которое непрерывно скользит по оси времени. Таким образом, скользящие окна ориентированы не на период, а на отметки времени записи данных [3]. Отметим, что скользящие окна типа sliding поддерживаются и в другом популярном Big Data инструменте обработке потоковых данных — Spark Streaming, о чем мы подробнее рассказываем здесь.

Кувыркающееся окно можно преобразовать в прыгающее с помощью DSL-метода advanceBy(). Таким образом, код объявления 5-минутного прыгающего окна с интервалом в 1 минуту будет выглядеть следующим образом: TimeWindows.of(TimeUnit.MINUTES.toMillis(5)).advanceBy(TimeUnit.MINUTES.toMillis(1)) [3].

hopping window, Apache Kafka Streams, Кафка Стримс, поточная обработка данных во временном периоде, прыгающее окно
5-минутное прыгающее окно Kafka Streams с интервалом в 1 минуту

Выбор типа окна определяется конкретной задачей и зависит от бизнес-требований. В частности, для анализа пользовательского поведения целесообразно работать с сеансовыми окнами, тогда как для отслеживания событий, привязанных ко времени, стоит выбрать кувыркающиеся, прыгающие или скользящие окна. В любом случае, все типы окон основаны на временных метках (дата и время) записей, а не на системном времени узла кластера Apache Kafka, собирающего и хранящего потоки Big Data.

Станьте профессионалом по быстрой обработке больших данных в режиме онлайн с помощью Apache Kafka Streams на специализированных курсах для руководителей, архитекторов, инженеров, администраторов, аналитиков Big Data и Data Scientist’ов в лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве:

Источники

  1. https://habr.com/ru/company/itsumma/blog/418389/
  2. https://habr.com/ru/company/piter/blog/457756/
  3. https://kafka.apache.org/20/documentation/streams/developer-guide/dsl-api.html
Поиск по сайту