В этой статье мы рассмотрим, чем похожи и чем отличаются 5 самых популярных инструментов распределенной обработки потоков Big Data: Apache Kafka Streams, Spark Streaming, Flink, Storm и Samza, а также поговорим про наиболее значимые факторы выбора между этими программными средствами.
5 общих характеристик распределенных Big Data фреймворков потоковой обработки
Прежде всего отметим, что Kafka Streams – это не самостоятельная среда, клиентская библиотека для разработки распределенных потоковых приложений и микросервисов, которые работают с данными, хранящимися в кластерах Кафка. Тем не менее, поскольку это средство позволяет эффективно обрабатывать потоки данных, мы также включим его в свой сравнительный анализ наряду с автономными фреймворками потоковых вычислений (Apache Spark, Flink, Storm и Samza).
Итак, для каждого из рассматриваемых инструментов (Apache Kafka Streams, Spark Streaming, Flink, Storm и Samza) характерны следующие свойства:
- Прикладное назначение – все перечисленные фреймворки предназначены специально для обработки потоков Big Data «на лету», фактически в режиме реального времени.
- Распространенность – каждая из отмеченных сред широко используется на практике среди крупных ИТ-проектов уровня Facebook, Google, LinkedIn, eBay, Amazon и пр., в различных бизнес-кейсах и Big Data системах государственных и частных компаний.
- Кластерная архитектура – Apache Kafka Streams, Spark Streaming, Flink, Storm и Samza являются средствами разработки распределенных приложений и потоковой обработки данных, хранящихся на разных физических и виртуальных узлах одного или нескольких кластеров.
- Распараллеливание задач – каждый инструмент поддерживает параллелизм вычислений, распределяя их по направленной графовой модели потоковых обработчиков, называемой DAG-топологией (Directed Acyclic Graph). О DAG-топоплогии на примере Apache Kafka Streams мы рассказывали здесь.
- Отказоустойчивость – надежность распределенных вычислений обеспечивается специальными механизмами восстановления в случае сбоя (контрольные точки или транзакции), которые позволяют вернуться к прерванной задаче по обработке данных и запустить ее заново на этом же самом или новом узле кластера.
10 главных различий Apache Kafka Streams, Spark Streaming, Flink, Storm и Samza
Несмотря на вышеуказанные сходства, все эти Big Data инструменты распределенных потоковых вычислений отличаются по следующим критериям:
- подход к обработке данных – работа с «настоящими» потоками непрерывно поступающей информации, как это реализуется в Apache Kafka Streams, Flink, Storm и Samza) или же микро-пакетный принцип (micro-batch), когда поток данных представляется в виде серии очень маленьких пакетов, как в Spark Streaming. В частности, Spark Streaming буферизует поток данных с шагом в одну секунду, формируя небольшие фиксированных датасеты для пакетной обработки [1]. Некоторые фреймворки поддерживают оба режима работы с данными, например, Apache Flink и Storm (с использованием высокоуровневого API Trident). А Apache Kafka и Samza реализуют только потоковый подход [2].
- Задержка (latency) – пакетный или потоковый режим обработки данных определяет максимальную задержку. Поэтому Spark Streaming, работающий в микропакетном режиме, на порядок медленнее, чем Apache Kafka Streams, Flink, Storm и Samza, которые взаимодействуют с непрерывным потоком сообщений.
- Потоковый примитив – архитектурная концепция для операций с данными – в каждом фреймворке принята своя собственная абстракция и ее реализация.
- Вычислительный примитив – как правило, это задача по обработке потокового примитива, которая по-разному может называться в различных фреймворках, например, «болт» (bolt) в Apache Storm и Потоковый обработчик (Stream Processor) в Kafka Streams [3].
- Семантика доставки сообщений – различают 3 вида доставки сообщений:
- максимум однократная (at most once), когда сообщения доставляются только единожды и могут быть потеряны;
- минимум однократная (at least once), когда сообщения могут быть доставлены повторно – они не теряются, но возможно дублирование;
- в точности однократная доставка (exactly once), когда каждое сообщение гарантированно доставляется только один раз, при этом сообщения не теряются и не дублируются.
Exactly once считается наилучшим вариантом, однако на практике его реализовать достаточно сложно. Поэтому не все распределенные фреймворки потоковой обработки поддерживают эту семантику доставки сообщений. В частности, Apache Kafka Streams, Spark Streaming и Flink обеспечивают в точности однократную доставку, а Storm и Samza гарантируют только семантику at least once. В прочем, с помощью API-интерфейса Trident Apache Storm также позволяет реализовать доставку сообщений методом exactly once [2].
- Управление состоянием – сохранение состояний распределенного приложения позволяет работать с сессиями клиент-серверных приложений, что критично во многих бизнес-кейсах, например, при подсчете количества пользователей, нажимающих на ссылку в течение часа [1]. Почти все анализируемые фреймворки позволяют сохранять состояние (stateful) во встроенном (Kafka Streams и Samza) или внешнем хранилище (Spark, Flink). Apache Storm изначально является stateless-инструментом, однако высокоуровневый API Trident позволяет сохранять состояние распределенных приложений и ему.
- Источники и приемники данных – Apache Spark, Flink и Storm ориентированы на работу с различными внешними файловыми системами, хранилищами и базами данных (Kafka, Cassandra, HDFS, OpenStack Swift, Cassandra, Amazon Kinesis, HBase, Google Cloud Platform Amazon S3, Kudu, MapR-FS), а Kafka Streams и Samza – только с данными, хранящимися в топиках кластера Кафка.
- Инструменты отказоустойчивости – то, что позволяет восстановить данные в случае сбоя, например, механизм контрольных точек (checkpoints), поддерживаемый Apache Spark и Flink, или транзакционность сообщений в Kafka Streams и Samza.
- Избирательная обработка данных – наличие возможностей гибкой обработки данных в определенном временном промежутке, например, сеансовые или временные окна, о которых мы рассказывали на примере Apache Kafka Streams. Кроме Kafka Streams, Spark Streaming и Flink также поддерживают временные окна, а Storm и Samza – нет.
- Поддерживаемые языки – каждый инструмент по умолчанию поддерживает тот язык программирования, на котором он сам разработан (в большинстве случаев это Java-подобная Scala). Однако, например, Spark также поддерживает R и Python, а универсальный язык описания интерфейсов Apache Thrift, используемый Storm позволяет работать вообще с любыми языками программирования (Java, Scala, Python, C#, Ruby и пр.).
Какие именно из вышеперечисленных различий являются наиболее значимыми факторами для выбора конкретного Big Data инструмента распределенной потоковой обработки, мы рассмотрим в следующей статье. А также наглядно сравним по этим критериям Apache Kafka Streams, Spark Streaming, Flink, Storm и Samza, чтобы помочь вам сделать объективный выбор наилучшего фреймворка.
Все прикладные особенности потоковой обработки данных разбираются на наших практических курсах обучения и повышения квалификации в лицензированном учебном центре для ИТ-специалистов, руководителей, архитекторов, инженеров, администраторов, аналитиков Big Data и Data Scientist’ов в Москве:
- Apache Kafka для разработчиков
- Основы Apache Spark для разработчиков
- Анализ данных с Apache Spark
- Потоковая обработка в Apache Spark
Источники
- https://quasar.site/tutorials/499/hadoop-storm-samza-spark-i-flink-sravnenie-platform-bolshikh-dannykh
- http://datareview.info/article/obrabotka-potokovyx-dannyx-storm-spark-i-samza/
- https://medium.com/@chandanbaranwal/spark-streaming-vs-flink-vs-storm-vs-kafka-streams-vs-samza-choose-your-stream-processing-91ea3f04675b