Потоковая обработка данных

В этом уроке разберём потоковую обработку данных, её особенности и отличия от пакетной.
✏️ Потоковая обработка данных — это технология обработки данных в реальном времени, по мере их поступления. В отличие от пакетной обработки, где данные обрабатываются блоками после сбора, потоковая обработка позволяет немедленно анализировать поступающую информацию и реагировать на неё.
Однако потоковая обработка — не панацея. Этот инструмент призван решать задачи, где требуется оперативная аналитика данных в режиме онлайн, но из-за необоснованности высоких расходов на ресурсы потоковая обработка не подходит для аналитики большого объёма данных за продолжительные периоды времени (часы, дни, месяцы, годы).

Сравнение потоковой обработки данных с пакетной

Раньше большинство задач аналитики данных закрывалось за счёт пакетной обработки, однако требования бизнеса растут и возникает потребность производить анализ и принимать решения почти в реальном времени. Это особенно актуально, например, для онлайн-магазинов, которые на основании действий клиентов (просмотренных продуктов, операций добавления товаров в корзину, истории покупок) хотят в режиме онлайн, пока клиент ещё на сайте, отображать персональные предложения и скидки на товары или услуги для повышения продаж. В этом случае как раз и пригодится потоковая обработка данных.
Давайте коротко сравним пакетную и потоковую обработку данных.
  • Пакетная обработка включает сбор данных в течение определённого времени, после чего данные обрабатываются как единый блок. Это традиционный подход к обработке данных, который подразумевает задержки из-за необходимости сбора пакетов данных перед их обработкой.
  • Потоковая обработка предполагает непрерывный приём и обработку данных по мере их поступления, что позволяет системе реагировать на события почти в реальном времени.

Преимущества потоковой обработки данных

  • Минимальная задержка Обработка данных в режиме реального времени обеспечивает мгновенную реакцию на входящие данные.
  • Улучшенное принятие решений Непрерывный анализ потока данных помогает оперативно принимать информированные решения.
  • Масштабируемость Системы потоковой обработки спроектированы так, чтобы эффективно масштабироваться и обрабатывать большие объёмы данных.
  • Гибкость Архитектура потоковой обработки позволяет легко интегрироваться с различными источниками данных и приложениями для удовлетворения меняющихся бизнес-требований.

Сложности потоковой обработки данных

  • Управление состоянием В отличие от пакетной обработки, потоковая требует эффективного управления состояниями потоков данных, что может быть технически сложно. Для решения ряда бизнес-задач может требоваться проанализировать несколько потоков данных, при этом для принятия качественного решения могут понадобиться события за большой промежуток времени, чтобы была возможность смаппить и агрегировать нужные данные. Это приводит к большому потреблению ресурсов, так как требуется держать в памяти большие объёмы данных или использовать полное или частичное хранение на диске, что может негативно сказаться на производительности.
  • Обработка ошибок В реальных системах данные могут быть неполными, повреждёнными или некорректными, поэтому система должна быть устойчивой к ошибкам в данных. Для этого нужно реализовать комплексные механизмы обработки ошибок и стратегии возврата сообщений для повторной обработки. От команды это потребует детального планирования, включая классификацию возможных ошибок и разработку стратегий их обработки (например, выбор между «at-least-once» и «exactly-once» семантиками доставки).
  • Требования к производительности Высокая производительность и низкая задержка критически важны: они задают требования к инфраструктуре. Рост требований к производительности и усложнение алгоритмов расчёта может значительно влиять на потребности в CPU. Увеличение окон обработки, количества обрабатываемых одновременно потоков и событий внутри них может приводить к росту потребления памяти. Необходимо оптимально распределить нагрузку между узлами и обеспечить при этом максимальную производительность и минимальную задержку обработки. Всё это требует изучения и оптимизации параметров параллелизма, выбора подходящей стратегии разбиения данных на партиции, а также оптимизации работы с внешними хранилищами и внешними системами.

Общий принцип работы потоковой обработки данных

Потоковую обработку можно представить в виде нескольких шагов.
  1. Захват данных  Обработка начинается с захвата данных. Данные могут быть получены из различных источников: событий из брокеров сообщений (Kafka), реляционных или нереляционных баз, файловых систем. На входе данные десериализуются, чтобы их можно было обработать.
  2. Обработка данных Этот этап может включать в себя большое количество шагов: фильтрацию, преобразование, агрегацию данных из нескольких источников, подсчёт количества совершённых событий для анализа данных, выявление закономерностей, трендов. Всё зависит от бизнес-задачи, которую требуется решить. Итоговой задачей может быть, например, выявление мошеннических операций, анализ поведения пользователей, аудит событий безопасности.
  3. Решение и запись данных  По итогу обработки принимается какое-либо решение: обнаружена закономерность, сформировано маркетинговое предложение для пользователя, выявлено мошенническое действие. В зависимости от результата обработки система выполняет дополнительные действия: публикацию события в брокер сообщений, запись данных в БД и так далее. Эти результаты могут быть затем обработаны как другим алгоритмом потоковой обработки, так и бизнес-приложением. Например, событие о формировании маркетингового предложения подхватывается сервисом нотификации и отправляется пользователю.
Теперь подробнее разберём этап обработки данных.

Модели потоковой обработки

Чаще всего команды продуктовой разработки не сталкиваются с выбором и реализацией моделей, так как в большинстве случаев значительно проще и эффективнее использовать готовые инструменты, которые мы разберём ниже. Тем не менее полезно разобраться, как эти инструменты устроены под капотом.
Существует четыре модели реализации потоковой обработки:
  1. Синхронная микропакетная обработка Вычисления запускаются на регулярной основе для обработки данных, появившихся с момента последней обработки. Особенность состоит в том, что при микропакетной модели запуски происходят очень часто, например, раз в пять секунд вместо раза в час. Поэтому данные в разрезе одного пакета могут быть обработаны значительно быстрее, а нагрузка распределяется, как правило, более равномерно. Однако в высоконагруженных системах, которым свойственны скачки нагрузки, синхронная микропакетная модель всё равно сталкивается с проблемой неравномерного распределения данных между пакетами. Это может приводить к большим задержкам в обработке данных. Пример. Синхронная микропакетная модель используется в Apache Spark Streaming.
  2. Асинхронная микропакетная модель Модель построена на триггерном механизме запуска задач внутри микропакетов. Записи на обработку между задачами внутри микропакета передаются асинхронно и параллельно с фактической обработкой данных в микропакете. Так обработка данных не блокируется операциями управления смещением, что значительно уменьшает задержку обработки данных. Пример. Такая модель используется в Apache Spark Structured Streaming.
  3. Streaming-модель Поток определяется как граф операций, который отображает передачу данных от источников к получателям. В отличие от подхода с микропакетами, задачи в потоке данных функционируют независимо друг от друга. Модель потоковой обработки рассматривает элементы потока (например, временные окна) как законченные в определённый момент времени. Из-за этого «опоздавшие» данные не могут быть включены в это окно. Пример. Такой подход используется в dataflow на Google Cloud Platform.
  4. Модель непрерывного обновления Потоковые данные никогда не считаются полностью обработанными и постоянно обновляются, даже если события устарели относительно временной метки. Такой подход предполагает восприятие данных как постоянно изменяющийся поток, где каждое изменение влияет на текущее состояние обработки. Одна из особенностей — возможность сброса состояния для реализации определённых сценариев, например, срабатывания уведомлений при первом удовлетворении условия. В противном случае уведомление активировалось бы для каждого последующего события, даже если оно произошло значительно позже и не представляло собой причины для тревоги. Пример. Такой подход применяется в топологии приложений Kafka Streams.

Окна обработки данных

Потоковая обработка данных применяется для выполнения вычислений над бесконечными потоками данных. Учитывая это, агрегирующие операции не могут быть завершены в обычном режиме, поскольку данные продолжают поступать постоянно — это мешает получению окончательных результатов.
Для решения этой проблемы в потоковой обработке используется метод оконной агрегации. Он позволяет выполнять агрегирующие операции в рамках определённого временного интервала, а не по всей совокупности данных.
Потоковая обработка особенно актуальна при анализе данных с различных устройств вроде мобильных телефонов, которые могут временно терять и вновь восстанавливать соединение с сетью, отправляя накопленные данные. Это создаёт дилемму между скоростью получения результатов и их точностью. С помощью выбора периода ожидания для поступления данных этим можно управлять:
  • Увеличение времени ожидания приводит к получению более точных результатов, однако их вычисление занимает больше времени.
  • Сокращение времени ожидания ускоряет получение результатов, но снижает их точность.
Например, запрос, который считает количество элементов в потоке данных в течение 20-секундного временного окна, может также учитывать запаздывающие данные, ожидая их поступления в течение дополнительных 30 секунд.
При разработке возникает вопрос: готов ли бизнес мириться с риском ошибки расчёта по причине опоздания какого-то события в пользу скорости получения результата. Или же в приоритете — качество и расчёт можно ждать в течение более долгого времени. Например, когда бизнесу важно отобразить пользователю персональное предложение, пока тот ещё находится на сайте, выбор, скорее всего, будет в пользу первого варианта. Если же персональное предложение может быть отправлено позже в уведомлении, то вполне подойдёт второй.

Инструменты для потоковой обработки

На рынке существует множество инструментов для потоковой обработки данных. Вот некоторые из них:
  • Apache Kafka Streams Расширение клиентской библиотеки Kafka, ориентированное на простоту создания приложений для потоковой обработки. Kafka Streams обеспечивает масштабируемость, устойчивость к сбоям и интеграцию с экосистемой Kafka.
  • Apache Flink Фреймворк для обработки потоков данных с высоким уровнем производительности и низким временем задержки. Flink разработан для запуска в масштабируемых и отказоустойчивых окружениях и поддерживает сложные сценарии обработки данных, такие как обработка временных окон и CEP.
  • Apache Storm Одна из первых систем, специализирующихся на потоковой обработке. Storm выделяется своей простотой, способностью к масштабированию и надёжностью. Подходит для задач, где требуется гарантия обработки каждого сообщения.
Все эти инструменты выполняют роль вычислительного движка для обработки данных. Они не могут использоваться для долгосрочного хранения: данные захватываются из внешних источников, обрабатываются и снова записываются во внешние источники.

Особенности инструментов

  • Производительность Kafka Streams и Flink предлагают более высокие показатели производительности в сравнении со Storm за счёт более современных подходов к обработке.
  • Гарантия обработки сообщений Storm фокусируется на гарантии доставки сообщений «точно один раз» («exactly-once»).
  • Удобство разработки Kafka Streams предлагает более высокий уровень абстракции, что упрощает разработку приложений для потоковой обработки.
  • Масштабируемость и отказоустойчивость Apache Flink предлагает продвинутые возможности для обработки больших объёмов данных с высокой степенью надёжности и масштабируемости.
  • Потребление ресурсов Каждое из решений потребляет разное количество ресурсов под разные задачи. Рекомендуется изучить спецификацию инструмента, опыт и результаты использования в других решениях, самостоятельно провести тестирование инструментов под свои задачи и определить уровень потребления ресурсов каждого решения.
При выборе решения для своего проекта лучше всего провести более полный анализ, исходя из требований, с которыми вы работаете.
Пример
Компания «ОнлиСхемы» хочет помочь пользователям из одной команды сотрудничать эффективнее. Для этого компания планирует отслеживать события действий пользователей, анализировать их и выявлять, не работают ли пользователи сейчас над одним и тем же вопросом. И если да, то отправлять уведомление с предложением поработать совместно.
Для решения этой задачи команда решила использовать потоковую обработку на базе Kafka Streams. Команда написала новый сервис, который в режиме реального времени отслеживает события работы с объектами, агрегирует их, отталкиваясь от идентификатора пространства, в котором работает пользователь, и пытается сопоставить события с помощью нечёткого сравнения строк с названиями объектов. В случае соответствия выше 70% формируется событие, публикуемое в отдельный топик Kafka. Этот топик прослушивает сервис нотификации и отправляет уведомление пользователям.
Так как действия пользователей могут значительно расходиться по времени, команда решила для начала установить окно обработки в пять минут. Такое решение может привести к значительному росту потребляемых ресурсов по мере увеличения популярности сервиса.

Задание 1

Нужно реализовать анализ событий снятия наличных в банкомате и публикацию события для систем противодействия мошенничеству, если количество операций за заданный промежуток времени в одном банкомате превысит определённое число.
Расположите действия, которые требуется выполнить в рамках потоковой обработки, в нужном порядке.
Чтение событий обо всех действиях клиентов в банкомате
Этап 1
Обработка всегда начинается с захвата данных.
Агрегация событий в разрезе банкоматов
Этап 3
Для проведения верного анализа события должны быть агрегированы в разрезе каждого банкомата, иначе мы получим суммарное количество снятий во всех банкоматах вместе.
Публикация события о превышении количества заданных операций
Этап 5
По итогу обработки может быть выявлено действие с признаками мошенничества. В этом случае требуется опубликовать событие для инициации дальнейших действий на стороне систем противодействия мошенничеству.
Анализ количества произошедших событий за заданное окно обработки
Этап 4
Для решения задачи требуется использование окна обработки, в рамках которого будут аккумулироваться события снятия для подсчёта их количества в одном банкомате за заданный промежуток времени.
Фильтрация событий о выдаче наличных в банкомате
Этап 2
Для этого кейса требуется анализ конкретного типа событий, поэтому обработчик должен сначала отфильтровать события снятия наличных.

Задание 2

Какие из следующих инструментов используются для потоковой обработки данных?
Apache Kafka — популярный инструмент передачи и хранения событий, однако он не реализует непосредственно логику потоковой обработки данных. Может выступать как один из возможных источников или брокер для передачи результатов обработки.
MySQL — это система управления реляционными базами данных, а не инструмент для потоковой обработки данных. Может выступать как один из возможных источников или хранилищ результатов обработки.
Широко известное хранилище событий, разработанное специально для поддержки Event Sourcing. Может выступать как один из возможных источников или хранилищ результатов обработки.
Один из самых популярных и легковесных инструментов потоковой обработки данных, использующий Apache Kafka в качестве источника событий.
Один из самых популярных фреймворков для обработки потоков данных с высоким уровнем производительности и низким временем задержки.

Дополнительные материалы

  • Что такое Apache Spark Streaming
  • Про Apache Spark Structured Streaming
  • Что такое концепция dataflow и почему она важна
  • Что такое Apache Kafka Streams: архитектура и принципы работы

Итоги

  • Потоковая обработка данных — это технология обработки данных в реальном времени, по мере их поступления. Этот инструмент призван решать задачи, где требуется оперативная аналитика данных в режиме онлайн, однако не подходит для задач, требующих обработки большого объёма данных за продолжительные периоды времени для целей аналитики, репортинга.
  • Существует четыре модели реализации потоковой обработки: синхронная микропакетная обработка, асинхронная микропакетная обработка, streaming-модель и модель непрерывного обновления.
  • В потоковой обработке используется метод оконной агрегации, который позволяет выполнять агрегирующие операции в рамках определённого временного интервала, а не по всей совокупности данных.