Проанализировав сходства и различия пяти самых популярных Big Data фреймворков для распределенных потоковых вычислений (Apache Kafka Streams, Spark Streaming, Flink, Storm и Samza), в этой статье мы сравним их по 10 критериям и отметим, какие именно факторы являются наиболее значимыми для объективного выбора.
Сравнительный анализ самых популярных фреймворков потоковой обработки больших данных
Прежде всего, еще раз отметим, что Apache Kafka Streams, Spark Streaming, Flink, Storm и Samza являются надежными, отказоустойчивыми, масштабируемыми и распределенными решениями с кластерной архитектурой. Все они предназначены специально для обработки потоков Big Data «на лету», распределяя вычисления по направленной графовой модели потоковых обработчиков, называемой DAG-топологией (Directed Acyclic Graph).
Тем не менее, при всех вышеуказанных сходствах, они во многом существенно отличаются друг от друга. Для большей наглядности ниже представлена сравнительная таблица Apache Kafka Streams, Spark Streaming, Flink, Storm и Samza.
Критерий / Фреймворк |
Kafka Streams |
Spark
|
Flink |
Storm |
Samza |
Подходы к обработке данных |
Только потоковый |
Только микро-пакетный |
Потоковый и пакетный |
Потоковый и пакетный с помощью Trident API |
Только потоковый |
Задержка (latency) |
Низкая (не более 1 миллисекунды) |
Высокая (> 1 сек) |
Низкая (не более 1 миллисекунды) |
Низкая (не более 1 миллисекунды) |
Низкая (не более 1 миллисекунды) |
Потоковый примитив |
Сообщение (message) потокового раздела (stream partition) соответствующее записи топика Кафка |
Дискретизированный поток (DStream), микро-пакет из нескольких RDD (resilient distributed dataset) — отказоустойчивых распределенных датасетов |
Поток данных (DataStream) |
Кортеж (tuple) — поток данных в виде неизменяемых наборов пар ключ-значение |
Сообщение (message) потокового раздела (stream partition) соответствующее записи топика Кафка |
Вычислительный примитив |
Потоковый обработчик (Stream Processor) |
Задача (task) |
Задача (task) |
Болт (bolt) – потоковый обработчик |
Задача (task) |
Семантика доставки сообщений |
exactly once |
exactly once |
exactly once |
at-least-once и exactly once с помощью Trident API |
at-least-once |
Сохранение состояния приложений (stateful) |
Да, состояние сохраняется во внутренних хранилищах топиков Кафка |
Да, состояние сохраняется во внешней распределенной файловой системе, например, HDFS |
Да, состояние сохраняется в локальном хранилище, а затем перемещается во внешнее долговременное хранилище |
Изначально нет (stateless), но Trident API позволяет сохранять состояние |
Да, состояние сохраняется во встроенном хранилище пар ключ-значение |
Источники и приемники данных |
Apache Kafka |
Apache Kafka, Cassandra, HDFS, OpenStack Swift, Cassandra, Amazon S3, Kudu, MapR-FS |
Apache Kafka, Cassandra, Amazon Kinesis, HBase, HDFS, Google Cloud Platform |
Apache Kafka, Kestrel, Amazon Kinesis, HBase, Cassandra, RabbitMQ, JMS |
Apache Kafka |
Инструменты отказоустойчивости |
механизм транзакционности сообщений |
механизм контрольных точек (checkpoints) |
механизм контрольных точек (checkpoints) |
автоматический перезапуск фоновых задач на этом же узле кластера или на другом, в случае его сбоя |
механизм транзакционности сообщений |
Избирательная обработка данных |
Временные и сеансовые окна |
Временные окна |
Временные окна |
Нет (механизм «окон» отсутствует) |
Нет (механизм «окон» отсутствует) |
Поддерживаемые языки |
Только JVM-языки (Scala, Java) |
Scala, Java, R, Python |
Scala, Java |
Любые (благодаря Apache Thrift): Java, Scala, Python, C#, Ruby и пр. |
Только JVM-языки (Scala, Java) |
Что следует учитывать при выборе Big Data фреймворка потоковой обработки: 5 критичных факторов
Все критерии, отмеченные в вышеприведенной сравнительной таблице, можно разделить на 2 категории:
- Функциональные характеристики, критичные с точки зрения прикладного использования:
- задержка обработки данных (latency);
- семантика доставки сообщений;
- управление состоянием (stateful /stateless);
- избирательная обработка данных;
- источники и приемники информации.
- Архитектурные особенности, которые обеспечивают реализацию критичных функциональных характеристик:
- потоковые и вычислительные примитивы;
- поддерживаемые подходы к обработке данных;
- инструменты отказоустойчивости;
- поддерживаемые языки программирования, API-интерфейсы, коннекторы и прочие средства разработки приложений.
Таким образом, когда требуется выбрать какое-то одно Big Data средство, следует внимательно учитывать достоинства и недостатки каждого инструмента, принимая во внимание самые важные характеристики, особенно значимые в каждом конкретном случае. Например, при жестких требованиях к минимальной задержке (low latency) не подойдет Apache Spark с его микро-пакетным подходом, а избирательную обработку данных в различных временных промежутках не поддерживают быстрые Storm и Samza. Также стоит учитывать источники и приемники данных, в частности, если предстоит обрабатывать информацию только из топиков Кафка, целесообразно выбрать Apache Kafka Streams или Samza, а при работе со множеством внешних Big Data хранилищ и баз данных следует рассмотреть Apache Spark, Flink или Storm.
Аналогично требуется оценивать поддерживаемую семантику доставки сообщений и сохранение состояния распределенных приложений. Таким образом, как и в любой ситуации, предполагающей сравнение возможных альтернатив, выбор конкретного Big Data фреймворка потоковой обработки данных является компромиссом между прикладными потребностями проектируемой системы и функциональными возможностями обеспечивающего инструмента.
Как выбрать и использовать в реальности наилучший распределенный фреймворк потоковой обработки данных, узнайте на наших практических курсах обучения и повышения квалификации в лицензированном учебном центре для ИТ-специалистов, руководителей, архитекторов, инженеров, администраторов, аналитиков Big Data и Data Scientist’ов в Москве:
- Apache Kafka для разработчиков
- Основы Apache Spark для разработчиков
- Анализ данных с Apache Spark
- Потоковая обработка в Apache Spark