Apache Storm
Apache Storm — это распределённая система потоковой обработки данных в реальном времени, разработанная на языке Java и Clojure. Относится к классу вычислительных фреймворков класса Big Data, предназначенных для обработки неограниченных потоков данных (stream processing) с гарантией доставки каждого сообщения хотя бы один раз (at-least-once) или ровно один раз (exactly-once). Система обеспечивает горизонтальное масштабирование, отказоустойчивость и низкую задержку обработки (миллисекунды), что позволяет применять её для задач мониторинга, аналитики, машинного обучения и управления событиями в реальном времени.
История
Разработка Apache Storm началась в 2010 году в компании BackType, занимавшейся аналитикой социальных сетей. Основным автором проекта выступил Натан Марц (Nathan Marz). В 2011 году BackType была приобретена компанией Twitter, после чего Storm стал внутренним инструментом для обработки потоков твитов и событий. В сентябре 2011 года исходный код был открыт под лицензией Apache License 2.0. В 2013 году проект перешёл в инкубатор Apache Software Foundation, а в сентябре 2014 года получил статус проекта верхнего уровня (Top-Level Project). В 2015 году Twitter выпустил версию Storm 1.0, которая включала значительные улучшения производительности и поддержку Java 8. С 2016 года развитие проекта замедлилось на фоне конкуренции с Apache Flink и Apache Spark Streaming, однако Storm продолжает использоваться в ряде промышленных систем.
Архитектура
Основные компоненты
Apache Storm использует топологию (topology) — граф вычислений, который описывает поток данных. Топология состоит из двух типов узлов:
- Spout — источник данных, который читает поток из внешней системы (например, Apache Kafka, RabbitMQ, базы данных, файлы). Spout эмитирует кортежи (tuples) — базовые единицы данных, представляющие собой упорядоченные списки значений.
- Bolt — узел обработки, который выполняет преобразования, фильтрацию, агрегацию, соединение потоков или запись результатов. Bolt может принимать данные от нескольких Spout или других Bolt.
Топология запускается на кластере, который состоит из трёх типов узлов:
- Nimbus — мастер-узел (аналог JobTracker в Hadoop). Отвечает за распределение задач, мониторинг состояния и перезапуск упавших компонентов. Nimbus не участвует в обработке данных — он только управляет метаданными.
- Supervisor — рабочий узел, который запускает и останавливает процессы-исполнители (workers) по указанию Nimbus. Каждый Supervisor может выполнять несколько задач (tasks) в рамках одной топологии.
- ZooKeeper — координационный сервис (Apache ZooKeeper), используемый для хранения состояния кластера, синхронизации Nimbus и Supervisor, а также для обнаружения сбоев.
Поток данных и гарантии доставки
Данные передаются в виде кортежей. Каждый кортеж имеет идентификатор (message ID), который позволяет отслеживать его обработку. Storm поддерживает три уровня гарантий:
- At-most-once — кортеж обрабатывается не более одного раза; при сбое данные теряются (минимальная задержка).
- At-least-once — кортеж обрабатывается как минимум один раз; при сбое возможна повторная отправка (гарантируется доставка, но возможны дубликаты).
- Exactly-once — кортеж обрабатывается ровно один раз; реализуется через механизм транзакционных топологий (Trident API) или с помощью идемпотентных операций.
Для обеспечения at-least-once Storm использует механизм «дерева кортежей» (tuple tree): каждый Spout фиксирует, что кортеж был полностью обработан, только когда все Bolt, получившие его, подтвердили (ack) обработку. Если какой-либо Bolt не подтверждает кортеж в течение заданного тайм-аута (по умолчанию 30 секунд), Spout повторно эмитирует кортеж.
Параллелизм и масштабирование
Топология может быть разбита на несколько параллельных потоков. Параллелизм задаётся тремя параметрами:
- Number of workers — количество процессов JVM, в которых выполняется топология.
- Number of executors — количество потоков внутри worker’а, каждый из которых может выполнять несколько задач.
- Number of tasks — количество логических единиц обработки (spout/bolt), которые могут быть распределены по executor’ам.
Группировка потоков (stream grouping) определяет, как кортежи распределяются между Bolt:
- Shuffle grouping — случайное распределение (равномерная нагрузка).
- Fields grouping — распределение по значению поля (например, по идентификатору пользователя — все кортежи с одним ID попадают в один Bolt).
- All grouping — широковещательная рассылка всем Bolt.
- Global grouping — все кортежи отправляются в один Bolt (с наименьшим ID).
- Direct grouping — Spout явно указывает, какому Bolt отправить кортеж.
API и языки программирования
Основной API Storm написан на Java. Однако система поддерживает многопоточность и позволяет писать Spout и Bolt на других языках через протокол Thrift (многопоточный сервер). Официально поддерживаются:
- Java — основной язык для разработки топологий.
- Clojure — язык, на котором написана часть ядра Storm; поддерживается через встроенную библиотеку.
- Python, Ruby, JavaScript — через протокол Storm Multi-Lang Protocol (использует стандартный ввод/вывод или сокеты).
Также существует Trident API — высокоуровневая абстракция над Storm, которая предоставляет операции, похожие на SQL (фильтрация, агрегация, соединение, оконные функции). Trident гарантирует exactly-once обработку, но снижает производительность по сравнению с низкоуровневым API.
Применение
Apache Storm используется в сценариях, где требуется обработка данных в реальном времени с задержками менее секунды:
- Мониторинг и оповещение — анализ логов, метрик, событий безопасности (например, обнаружение аномалий в сетевом трафике).
- Аналитика в реальном времени — подсчёт статистики (число пользователей, клики, транзакции) с немедленной визуализацией.
- Машинное обучение — онлайн-обучение моделей (например, градиентный бустинг, нейронные сети) на потоковых данных.
- Обработка событий — в системах управления событиями (CEP), например, в финансовых трейдинговых платформах.
- Интеграция с Apache Kafka — Storm часто используется как потребитель (consumer) из Kafka для дальнейшей обработки.
Примеры использования
- Twitter — первоначально Storm обрабатывал поток твитов для ранжирования, анализа трендов и рекомендаций. После перехода на Apache Heron (внутренняя разработка Twitter) Storm был вытеснен, но остаётся в legacy-системах.
- Yahoo! — использовал Storm для обработки данных рекламной платформы и мониторинга инфраструктуры.
- Alibaba — применял Storm для аналитики электронной коммерции в реальном времени.
- Spotify — обрабатывал потоки данных о прослушивании музыки для рекомендаций.
Сравнение с аналогами
Apache Storm конкурирует с другими системами потоковой обработки:
| Система | Тип обработки | Гарантии доставки | Задержка | Управление состоянием |
|---|---|---|---|---|
| Apache Storm | Потоковая (native) | At-least-once / exactly-once (Trident) | Миллисекунды | Внешнее (через Bolt) |
| Apache Flink | Потоковая (native) | Exactly-once | Миллисекунды | Встроенное (state backend) |
| Apache Spark Streaming | Микро-батчи | Exactly-once | Секунды (микро-батчи) | Встроенное (RDD) |
| Apache Samza | Потоковая (native) | At-least-once | Миллисекунды | Внешнее (Kafka) |
Storm уступает Flink в производительности при exactly-once обработке и встроенном управлении состоянием, но остаётся более простым в развёртывании для небольших кластеров.
Критика и ограничения
- Сложность управления состоянием — Storm не предоставляет встроенного хранилища состояния; разработчики вынуждены реализовывать его самостоятельно (например, через Redis или базы данных).
- Проблемы с exactly-once — Trident API снижает пропускную способность и увеличивает задержку, что делает его непригодным для некоторых сценариев.
- Отсутствие встроенной поддержки окон — оконные функции (например, скользящее окно) требуют ручной реализации в Bolt.
- Снижение активности сообщества — после 2016 года развитие Storm замедлилось, многие новые функции (например, поддержка Kubernetes) появились только в 2018–2019 годах. Ряд компаний мигрировал на Flink или Spark Streaming.
Интересные факты
- Название «Storm» (шторм) было выбрано автором Натаном Марцем как метафора «бури данных», которую система должна обрабатывать.
- Storm изначально проектировался как замена Hadoop MapReduce для задач, требующих низкой задержки.
- В 2014 году Storm был признан самым популярным проектом для потоковой обработки в опросе Apache Software Foundation.
- Версия Storm 2.0 (выпущена в 2019 году) включает поддержку Java 11, улучшенную производительность и новый API для работы с Kafka.
Источники
- Apache Storm Documentation (официальная документация проекта)
- «Storm: Distributed Real-time Computation System» — Натан Марц (2011)
- «Big Data: Principles and Best Practices of Scalable Real-time Data Systems» — Натан Марц, Джеймс Уоррен (2015)
- «Learning Storm» — Анил П. С. (2015)
- Статья «Apache Storm vs. Apache Flink: A Comparison» — журнал «InfoWorld» (2017)
- Материалы конференции ApacheCon (2013–2019)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →