Обработка потоковых данных: Storm, Spark и Samza

Существует целый ряд распределенных вычислительных систем, предназначенных для обработки больших данных в режиме реального времени. В этой статье мы кратко рассмотрим три фреймворка Apache и сделаем компактный высокоуровневый обзор их сходств и различий.

Apache Storm

При работе со Storm мы создаем граф вычислений реального времени, называемый топологией (topology), и передаем его в кластер, где главный узел распределяет код между рабочими узлами для выполнения. Основными элементами топологии являются спауты (spout) и болты (bolt). Спауты генерируют потоки данных в форме неизменяемых наборов пар ключ-значение, называемых кортежами (tuple), а болты выполняют преобразование этих потоков (подсчет, фильтрация, т.п.). Болты, в свою очередь, могут передавать данные другим болтам для выполнения последовательных стадий обработки.

Apache Spark

Spark Streaming (расширение базового API Spark) в отличие от Storm не обрабатывает потоки целиком. Вместо этого перед обработкой потоки разбиваются на небольшие пакеты временных интервалов. Абстракция Spark для потока данных называется DStream. DStream (discretized stream, дискретизированный поток) представляет собой микро-пакет, содержащий несколько RDD. RDD (resilient distributed dataset, отказоустойчивый распределенный набор данных) – это распределенная коллекция данных. RDD могут обрабатываться параллельно с помощью произвольных функций и преобразований на основе скользящего окна (sliding window).

Apache Samza

Концепция Samza заключается в обработке сообщений по одному по мере их получения. Потоковым примитивом Samza является не кортеж или DStream, а сообщение (message). Потоки разбиваются на разделы (partition). Каждый раздел представляет собой упорядоченную последовательность доступных только для чтения сообщений. Каждое сообщение имеет уникальный идентификатор (смещение). Система также поддерживает пакетный режим (batching), который позволяет последовательно принимать несколько сообщений из одного раздела потока. Модули выполнения и обмена сообщениями Samza являются подключаемыми, т.е. при желании могут быть заменены аналогами, хотя обычно используются YARN и Apache Kafka.

Сходства

Все три рассмотренные выше системы имеют открытый исходный код, малое время задержки и распределенную архитектуру, а также обеспечивают масштабируемость и отказоустойчивость. Каждая система позволяет выполнять код обработки потока с помощью параллельных задач (task), распределенных по узлам кластера. Кроме того, все описанные фреймворки предоставляют простые API, абстрагирующие сложную реализацию.

Документация каждой системы использует различную терминологию для описания аналогичных концепций:

  Storm Spark Samza
Источник потока Спаут (spout) Ресивер (receiver) Потребитель (consumer)
Потоковый примитив Кортеж (tuple) DStream Сообщение (message)
Вычислительный примитив Болт (bolt) Преобразование (transformation), оконная операция (window operation) Задача (task)

 Различия

 Основные различия рассматриваемых систем представлены в таблице:

  Storm Spark Samza
Семантика доставки сообщений Минимум однократная доставка (at least once) или в точности однократная доставка (exactly once) при использовании Trident. В точности однократная доставка (exactly once). За исключением некоторых ситуаций, связанных со сбоями. Минимум однократная доставка (at least once).
Управление состоянием Состояние не сохраняется (stateless). Можно использовать  собственную реализацию или Trident. Состояние сохраняется (stateful) в файловой системе. Состояние сохраняется (stateful) во встроенном хранилище пар ключ-значение.
Задержка Менее секунды. Несколько секунд. Зависит от размера пакета. Менее секунды.
Поддерживаемые языки Любые. JVM-языки, Ruby, Python, JavaScript, Perl. Scala, Java, Python. Только JVM-языки. Scala, Java.

Существует три общих категории семантик доставки сообщений:

  1. Максимум однократная доставка (at most once). Сообщения могут быть потеряны, что обычно является наименее желаемым сценарием.
  2. Минимум однократная доставка (at least once). Сообщения могут быть повторно доставлены (сообщения не теряются, но дублируются). Эта схема подходит для многих практических задач.
  3. В точности однократная доставка (exactly once). Каждое сообщение доставляется именно один раз (сообщения не теряются и не дублируются). Это свойство системы является желательным, но его трудно обеспечить для всех случаев.

Другим аспектом является управление состоянием. Существуют различные стратегии хранения состояния. Spark Streaming записывает состояние в распределенную файловую систему (например, HDFS). Samza использует встроенное хранилище пар ключ-значение. Работая со Storm, пользователь должен либо реализовать собственный вариант управления состоянием на уровне приложения, либо использовать абстракцию более высокого уровня под названием Trident.

Варианты применения

Все три фреймворка прекрасно подходят для эффективной обработки потока больших данных в реальном времени. Так какой же из них выбрать? Здесь нет строгих правил, можно дать лишь несколько общих рекомендаций.

Если нам нужна высокоскоростная система обработки событий, обеспечивающая инкрементные вычисления, Storm будет хорошим выбором. Если далее нам потребуется выполнять распределенные вычисления по требованию, в то время как клиент синхронно ожидает результат, Storm предоставит нам готовую подсистему распределенного удаленного вызова процедур (distributed RPC). Кроме того, поскольку Storm использует Apache Thrift, мы можем писать топологии на любом языке программирования. Если же нас интересует сохранение состояния и/или в точности однократная доставка сообщений, тогда следует обратиться к Trident API, который также позволяет работать с микро-пакетами.

Некоторые компании, использующие Storm: Twitter, Yahoo!, Spotify, The Weather Channel.

Если нам необходимо сохранение состояния, в точности однократная доставка сообщений, и при этом нас не очень беспокоит более длительная задержка, тогда мы можем выбрать Spark Streaming. Этот фреймворк особенно подойдет в том случае, если мы планируем выполнять графовые операции, машинное обучение или SQL-доступ. Стек Apache Spark позволяет использовать совместно со Streaming несколько других библиотек (Spark SQL, MLlib, GraphX) и реализует удобную унифицированную модель программирования. В частности, в сочетании с потоковыми алгоритмами, такими как потоковый метод k-средних (streaming k-means), Spark может быть применен для обеспечения принятия решений в реальном времени.

Некоторые компании, использующие Spark: Amazon, Yahoo!, NASA JPL, eBay Inc., Baidu.

В том случае, если нам предстоит работать с состоянием, имеющим большой объем (например, несколько гигабайт на раздел), тогда нашим выбором может стать Samza. Этот фреймворк выполняет обработку на тех же машинах, где хранится состояние, что позволяет эффективно работать с состоянием, которое не помещается в памяти. Samza также обеспечивает гибкость благодаря возможности подключения сторонних модулей. Модули выполнения, обмена сообщениями и хранения могут быть заменены любыми альтернативами. Кроме того, если проект предполагает несколько этапов обработки данных, которые реализуются разными командами с разными базами кода, дополнительное преимущество обеспечат задания Samza, поскольку их подключение/отключение оказывает минимальное воздействием на систему в целом.

Некоторые компании, использующие Samza: LinkedIn, Intuit, Metamarkets, Quantiply, Fortscale.

Заключение

Сегодня мы сделали краткий обзор трех фреймворков Apache для потоковой обработки. Мы рассмотрели основные сходства и различия данных систем, а также варианты их применения. Важно отметить, что функциональные возможности рассмотренных фреймворков быстро эволюционируют.

комментариев 6

  1. Anna:

    Спасибо за понятный и в то же время краткий обзор! А почему забыли Apache Flink? Этот фреймворк RT-потоковой обработки он тоже отлично вписывается в тему статьи.

    Ответить

Добавить комментарий

Ваш адрес email не будет опубликован.

закрыть

Поделиться

Отправить на почту
закрыть

Вход

закрыть

Регистрация

+ =