Потоковая обработка данных
В этом уроке разберём потоковую обработку данных, её особенности и отличия от пакетной.
✏️ Потоковая обработка данных — это технология обработки данных в реальном времени, по мере их поступления. В отличие от пакетной обработки, где данные обрабатываются блоками после сбора, потоковая обработка позволяет немедленно анализировать поступающую информацию и реагировать на неё.
Однако потоковая обработка — не панацея. Этот инструмент призван решать задачи, где требуется оперативная аналитика данных в режиме онлайн, но из-за необоснованности высоких расходов на ресурсы потоковая обработка не подходит для аналитики большого объёма данных за продолжительные периоды времени (часы, дни, месяцы, годы).
Сравнение потоковой обработки данных с пакетной
Раньше большинство задач аналитики данных закрывалось за счёт пакетной обработки, однако требования бизнеса растут и возникает потребность производить анализ и принимать решения почти в реальном времени. Это особенно актуально, например, для онлайн-магазинов, которые на основании действий клиентов (просмотренных продуктов, операций добавления товаров в корзину, истории покупок) хотят в режиме онлайн, пока клиент ещё на сайте, отображать персональные предложения и скидки на товары или услуги для повышения продаж. В этом случае как раз и пригодится потоковая обработка данных.
Давайте коротко сравним пакетную и потоковую обработку данных.
- Пакетная обработка включает сбор данных в течение определённого времени, после чего данные обрабатываются как единый блок. Это традиционный подход к обработке данных, который подразумевает задержки из-за необходимости сбора пакетов данных перед их обработкой.
- Потоковая обработка предполагает непрерывный приём и обработку данных по мере их поступления, что позволяет системе реагировать на события почти в реальном времени.
Преимущества потоковой обработки данных
- Минимальная задержка Обработка данных в режиме реального времени обеспечивает мгновенную реакцию на входящие данные.
- Улучшенное принятие решений Непрерывный анализ потока данных помогает оперативно принимать информированные решения.
- Масштабируемость Системы потоковой обработки спроектированы так, чтобы эффективно масштабироваться и обрабатывать большие объёмы данных.
- Гибкость Архитектура потоковой обработки позволяет легко интегрироваться с различными источниками данных и приложениями для удовлетворения меняющихся бизнес-требований.
Сложности потоковой обработки данных
- Управление состоянием В отличие от пакетной обработки, потоковая требует эффективного управления состояниями потоков данных, что может быть технически сложно. Для решения ряда бизнес-задач может требоваться проанализировать несколько потоков данных, при этом для принятия качественного решения могут понадобиться события за большой промежуток времени, чтобы была возможность смаппить и агрегировать нужные данные. Это приводит к большому потреблению ресурсов, так как требуется держать в памяти большие объёмы данных или использовать полное или частичное хранение на диске, что может негативно сказаться на производительности.
- Обработка ошибок В реальных системах данные могут быть неполными, повреждёнными или некорректными, поэтому система должна быть устойчивой к ошибкам в данных. Для этого нужно реализовать комплексные механизмы обработки ошибок и стратегии возврата сообщений для повторной обработки. От команды это потребует детального планирования, включая классификацию возможных ошибок и разработку стратегий их обработки (например, выбор между «at-least-once» и «exactly-once» семантиками доставки).
- Требования к производительности Высокая производительность и низкая задержка критически важны: они задают требования к инфраструктуре. Рост требований к производительности и усложнение алгоритмов расчёта может значительно влиять на потребности в CPU. Увеличение окон обработки, количества обрабатываемых одновременно потоков и событий внутри них может приводить к росту потребления памяти. Необходимо оптимально распределить нагрузку между узлами и обеспечить при этом максимальную производительность и минимальную задержку обработки. Всё это требует изучения и оптимизации параметров параллелизма, выбора подходящей стратегии разбиения данных на партиции, а также оптимизации работы с внешними хранилищами и внешними системами.
Общий принцип работы потоковой обработки данных
Потоковую обработку можно представить в виде нескольких шагов.
- Захват данных Обработка начинается с захвата данных. Данные могут быть получены из различных источников: событий из брокеров сообщений (Kafka), реляционных или нереляционных баз, файловых систем. На входе данные десериализуются, чтобы их можно было обработать.
- Обработка данных Этот этап может включать в себя большое количество шагов: фильтрацию, преобразование, агрегацию данных из нескольких источников, подсчёт количества совершённых событий для анализа данных, выявление закономерностей, трендов. Всё зависит от бизнес-задачи, которую требуется решить. Итоговой задачей может быть, например, выявление мошеннических операций, анализ поведения пользователей, аудит событий безопасности.
- Решение и запись данных По итогу обработки принимается какое-либо решение: обнаружена закономерность, сформировано маркетинговое предложение для пользователя, выявлено мошенническое действие. В зависимости от результата обработки система выполняет дополнительные действия: публикацию события в брокер сообщений, запись данных в БД и так далее. Эти результаты могут быть затем обработаны как другим алгоритмом потоковой обработки, так и бизнес-приложением. Например, событие о формировании маркетингового предложения подхватывается сервисом нотификации и отправляется пользователю.
Теперь подробнее разберём этап обработки данных.
Модели потоковой обработки
Чаще всего команды продуктовой разработки не сталкиваются с выбором и реализацией моделей, так как в большинстве случаев значительно проще и эффективнее использовать готовые инструменты, которые мы разберём ниже. Тем не менее полезно разобраться, как эти инструменты устроены под капотом.
Существует четыре модели реализации потоковой обработки:
- Синхронная микропакетная обработка Вычисления запускаются на регулярной основе для обработки данных, появившихся с момента последней обработки. Особенность состоит в том, что при микропакетной модели запуски происходят очень часто, например, раз в пять секунд вместо раза в час. Поэтому данные в разрезе одного пакета могут быть обработаны значительно быстрее, а нагрузка распределяется, как правило, более равномерно. Однако в высоконагруженных системах, которым свойственны скачки нагрузки, синхронная микропакетная модель всё равно сталкивается с проблемой неравномерного распределения данных между пакетами. Это может приводить к большим задержкам в обработке данных. Пример. Синхронная микропакетная модель используется в Apache Spark Streaming.
- Асинхронная микропакетная модель Модель построена на триггерном механизме запуска задач внутри микропакетов. Записи на обработку между задачами внутри микропакета передаются асинхронно и параллельно с фактической обработкой данных в микропакете. Так обработка данных не блокируется операциями управления смещением, что значительно уменьшает задержку обработки данных. Пример. Такая модель используется в Apache Spark Structured Streaming.
- Streaming-модель Поток определяется как граф операций, который отображает передачу данных от источников к получателям. В отличие от подхода с микропакетами, задачи в потоке данных функционируют независимо друг от друга. Модель потоковой обработки рассматривает элементы потока (например, временные окна) как законченные в определённый момент времени. Из-за этого «опоздавшие» данные не могут быть включены в это окно. Пример. Такой подход используется в dataflow на Google Cloud Platform.
- Модель непрерывного обновления Потоковые данные никогда не считаются полностью обработанными и постоянно обновляются, даже если события устарели относительно временной метки. Такой подход предполагает восприятие данных как постоянно изменяющийся поток, где каждое изменение влияет на текущее состояние обработки. Одна из особенностей — возможность сброса состояния для реализации определённых сценариев, например, срабатывания уведомлений при первом удовлетворении условия. В противном случае уведомление активировалось бы для каждого последующего события, даже если оно произошло значительно позже и не представляло собой причины для тревоги. Пример. Такой подход применяется в топологии приложений 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
Для этого кейса требуется анализ конкретного типа событий, поэтому обработчик должен сначала отфильтровать события снятия наличных.
Итоги
- Потоковая обработка данных — это технология обработки данных в реальном времени, по мере их поступления. Этот инструмент призван решать задачи, где требуется оперативная аналитика данных в режиме онлайн, однако не подходит для задач, требующих обработки большого объёма данных за продолжительные периоды времени для целей аналитики, репортинга.
- Существует четыре модели реализации потоковой обработки: синхронная микропакетная обработка, асинхронная микропакетная обработка, streaming-модель и модель непрерывного обновления.
- В потоковой обработке используется метод оконной агрегации, который позволяет выполнять агрегирующие операции в рамках определённого временного интервала, а не по всей совокупности данных.