Cервис Twitter открыл код проекта Storm,
предназначенного для анализа больших непрерывно поступающих потоков
данных, таких как миллионы лент в Twitter. Продукт был создан компанией
BackType, которая была куплена Twitter в июле этого кода. Код открыт под
лицензией Eclipse Public Licence 1.0. Система написана на языке Clojure
и выполняется внутри виртуальной машины JVM, некоторые скрипты написаны
на языке Python.
Система Storm использовалась для обеспечения работы сервиса BackTweets,
предназначенного для анализа отражения определенных событий в
микроблогах, путем сопоставления на лету новых твитов и используемых в
них ссылок. Например, производилась оценка, как внешние ссылки или
публикуемые в твиттере анонсы, ретранслируются другими участниками.
Несмотря на кажущуюся простоту, для непрерывно поступающих потоков
сообщений задача является достаточно сложной: чтобы определить число
уникальных просмотров URL через Twitter нужно посчитать число сообщений с
данным URL, сформировать общую выборку из всех читателей (followers)
микроблогов в которых упомянут URL и отсеять среди них дубликаты.
Storm представляет собой распределенную и отказоустойчивую
систему обработки неструктурированных постоянно обновляемых потоков
данных (обработка сложных событий - Complex Event Processing).
Функциональность Storm сравнивается с платформой Hadoop, при этом
ключевым отличием является то, что данные обрабатываются в режиме
реального времени. В отличие от традиционных аналитических систем
реального времени от компаний Oracle, StreamBase и SAP, которые
предварительно накапливают данные во внутреннем хранилище, в Storm нет
встроенной прослойки для организации хранилища, как в Hadoop. В случае
Storm пользователь определяет аналитический запрос, который начинает
применяться к поступающим данным до тех пор, пока данный запрос не будет
отменен (если в Hadoop используются занимающие конечное время
MapReduce-работы, то в Storm применяется идея непрерывно выполняемых
"топологий"). При этом выполнение анализа может быть распределено на
несколько серверов - Storm автоматически распараллеливает работу с
потоками на разные узлы кластера.
Области применения Storm:
- Обработка потоков новых данных или обновлений БД в реальном времени;
- Непрерывные вычисления: Storm может выполнять
непрерывные запросы и обрабатывать непрерывные потоки, передавая
результаты обработки клиенту в режиме реального времени. Например, можно
сформировать постоянно обновляемую страницу с наиболее обсуждаемыми
темами в Twitter;
- Распределенный удаленный вызов процедур (RPC): Storm
может быть использован для обеспечения параллелизма выполнения
ресурсоёмких запросов. Задание ("топология") в Storm представляет собой
распределенную по узлам функцию, которая ожидает поступления сообщений,
которые нужно обработать. После приема сообщения, функция обрабатывает
его в локальном контексте и возвращает результат. Примером использования
распределенного RPC может быть параллельная обработка поисковых
запросов или выполнение операций над большим набором множеств.
Основные особенности Storm:
- Простая модель программирования, значительно упрощающая обработку данных в режиме реального времени;
- Поддержка любых языков программирования. Уже созданы
модули для языков Java, Ruby и Python, адаптация для других языков не
вызывает сложности благодаря очень простому коммуникационному протоколу,
для реализации поддержки которого требуется около 100 строк кода;
- Отказоустойчивость: для запуска задания по обработке
данных требуется сформировать jar-файл с кодом. Storm самостоятельно
распространит данный jar-файл по узлам кластера, подключит связанные с
ним обработчики и организует мониторинг. При завершении задания код
будет автоматически отключен на всех узлах;
- Горизонтальная масштабируемость. Все вычисления
производятся в параллельном режиме, при возрастании нагрузки к кластеру
достаточно просто подключить новые узлы;
- Надежность. Storm гарантирует, что каждое
поступающее сообщение будет полностью обработано как минимум один раз.
Один раз сообщение будет обработано только в случае отсутствия ошибок
при прохождении всех обработчиков, если возникли проблемы, то неудачные
попытки обработки будут повторены.
- Скорость. Код Storm написан с оглядкой на высокую
производительность и использует для быстрого асинхронного обмена
сообщениями систему ZeroMQ.
|