Apache Storm был предложен Twitter'ом в 2011 году. Storm преподносится как Hadoop для обработки данных в реальном времени. Storm ориентирован на потоковую обработку данных и непрерывные вычисления. Storm написан на языке Clojure, поддерживает приложения на любом языке. Storm предназначено для распределённой обработки данных, но только в режиме реального времени. Storm работает не со статистическими данными, а с потоковыми, которые поступают непрерывно. Storm является примером систем сложной обработки событий (Complex Event Processing, CEP), которые обычно подразделяют на вычислительные и регистрирующие системы и каждый из классов этих систем можно реализовать в Storm. Изначально Storm использовался в Twitter'е для извлечения информации о тенденциях из потока твитов и отслеживания их на местном и национальном уровне. Storm поддерживает создание топологий, которые преобразуют незавершённые потоки данных, которые никогда не прекращаются и продолжают обрабатываться по мере их поступления. Clojure --- язык на основе виртуальной машины Java. Основные атрибуты Storm: 1) для передачи сообщений Storm использует механизм ZeroMQ. Этот механизм исключает промежуточные очереди и позволяет задачам непосредственно обмениваться сообщениями друг с другом. В основе системы обмена сообщениями лежит автоматизированный и эффективный механизм сериализации; 2) ориентированность на отказоустойчивость и управление: Storm реализует гарантированную обработку сообщений (каждый кортеж (Tuple) проходит полную обраоботку в рамках топологии); 3) в Storm реализовано обнаружение ошибок на уровне задач; в случае сбоя задача возвращается на повторную обработку. Концептуальная архитектура топологии Storm Spout Bolt [Воронка]------------->(Сито)----------\ \ Преобразование потоков Stream >(Сито) +------------>(Сито)------------^ ^ Spout Поток кортежей | [Воронка]------------->(Сито)--------------+ Tuple 4) в модели Storm реализуется передача данных (непрерывная обработка данных). Абстракция для передачи данных называется потоком (Stream). Stream представляет собой бесконечную последовательности Tuples. Кортеж представляет собой структуру, которая может содержать стандартные типы данных или типы, определённые пользователем. Каждый поток помечается уникальным идентификатором (используются для построения топологии источников и приёмников данных). Источниками данных являются воронки (Spout), которые принимают данные из внешних источников. Сито выполняет отдельные преобразования потока и всю обработку. Сита (приёмники данных) могут решать традиционные задачи (реализовывать MapReduce) или выполнять более сложные задачи, такие как фильтрация, агрегирование, связь с внешними объектами (например, с БД). Storm часто используется для простой реализации функциональности MapReduce: (Bolt (reduce)) ^ / [Spout]->(Bolt (map)) 5) Storm поддерживает понятие "группирования потоков". Потоки перетасовываются случайным образом, но в обязательном порядке. 6) концепция гарантированной обработки сообщений: Storm гарантирует, что каждый кортеж, который поступает из воронки, будет обработан. Если кортеж не обрабатывается за некоторое время, то Storm заново выпускает его из воронки в сито Механизм ZeroMQ предназначен для достижения максимальной производительности обмена сообщениями: исключаются промежуточные очереди и реализуется прямой обмен сообщениями между задачами. Также ZeroMQ содержит механизм обнаружения заторов и изменяет сообщения для оптимизации пропускной способности. Storm можно устанавливать как на кластер, так и на локальные узлы. 7) Storm является вычислительной системой без хранения данных; это обеспечивает некую универсальности использования Storm'а. Spark называют альтернативой для быстрого анализа данных. Он предлагает некоторые преимущества по сравнению с Hadoop-платформой. Spark --- это масштабируемая платформа анализа данных, которая включает в себя примитивы для вычислений в оперативной памяти. Spark реализован на языке Scala и также Spark представляет собой кластерную вычислительную платформу, которая является разработкой, аналогичной Hadoop. В Spark, помимо интерактивных запросов, также поддерживает распределённые наборы данных в оперативной памяти. Spark чаще всего используется в дополнение к Hadoop и работает непосредственно с файловой системой Hadoop. Такая интеграция может происходить в среде кластеризации Mesos. Spark был разработан в калифорнийском университете, в Беркли, в одной из лабораторий этого университета, которая называлась "Алгоритмы, машины и люди". Spark предназначен для решений в вычислительном кластере задач определённого типа --- задач, в которых рабочий набор данных многократно используется в параллельных операциях. Для оптимизации задач этого типа в Spark вводится понятие кластерных вычислений в памяти: наборы данных могут временно храниться в оперативной памяти, чтобы уменьшить время доступа. Кроме этого, в Spark вводится понятие устойчивого распространения набора данных (RDD, resilient distributed datasets). RDD --- это коллекция неизменяемых объектов, распределённых по множеству узлов; в случае потери части данных эти данные могут быть восстановлены. Процесс восстановления части набора данных для обеспечения отказоустойчивости опирается на механизм отказоустойчивости, которые поддерживает т. н. "родословную" (информацию, которая позволяет восстанавливать часть набора данных с помощью процесса, из которого эти данные получены). RDD представляют собой объекты Scala. В Spark все приложения называются драйверами, и эти драйверы осуществляют операции, которые выполняются на одном узле либо параллельно на наборе узлов. Так же, как и Hadoop, Spark поддерживает кластеры, состоящие из одного узла или из множества узлов. Когда Spark работает со множеством узлов, он опирается на менеджер кластеров Mesos. Mesos обеспечивает эффективную платформу распределения ресурсов и изоляции распределённых приложений. Такой подход позволяет Spark'у сосуществовать с Hadoop'ом и взаимодействовать непосредственно со своими узлами. Модель программирования Spark Драйвер может выполнять над набором данных операции двух типов: действие и преобразование. Действие --- это вычисление на наборе данных с возвратом значения в драйвер (операции сокращения, перебор набора данных). Преобразование создаёт новый набор данных из существующих (операция Map).