В продолжение недавней статьи для дата-инженеров про альтернативные платформы потоковой передачи событий вместо Apache Kafka, сегодня рассмотрим пример аналитики больших данных средствами Flink SQL, записи результатов в Elasticsearch и их визуализации в Kibana. Читайте далее, чем Redpanda отличается от Kafka, а Flink – от Apache Spark с точки зрения потоковой передачи данных.
Flink SQL и Apache Kafka: простой пример
Спрос на потоковую обработку данных особенно вырос в последние годы благодаря архитектуре, управляемой событиями, потребности в более быстрой аналитике и доступности различных технологических стеков. Одним из популярных компонентов такого стека является Apache Flink, который ориентирован на потоковую парадигму, а пакетный файл рассматривается как частный случай ограниченного потока.
Flink имеет несколько API разные уровней абстракции. На самом высоком уровне находится Flink SQL, который позволяет легко создавать сложные конвейеры потоковой передачи. Flink SQL совместим с ANSI SQL и поддерживает такие конструкции, как cоединения, агрегирование, оконные и пользовательские функции. Благодаря широкому набору DDL-операторов, Flink SQL может декларативно интегрироваться со множеством источников и приемников данных. Например, следующий запрос Flink SQL обеспечивает чтение сообщений в формате CSV из топика Apache Kafka:
CREATE TABLE access_logs (
event_time TIMESTAMP(3) METADATA FROM ‘timestamp’,
host STRING,
ident STRING,
authuser STRING,
request STRING,
status SHORT,
bytes BIGINT
) WITH (
‘connector’ = ‘kafka’, — using kafka connector
‘topic’ = ‘logs’, — kafka topic
‘scan.startup.mode’ = ‘earliest-offset’, — reading from the beginning
‘properties.bootstrap.servers’ = ‘kafka:9094’, — kafka broker address
‘format’ = ‘csv’
);
После объявления таблицы, в которую записываются потоковые данные, из нее можно извлечь нужные результаты. Например, вывести количество записей с различным статусом:
SELECT count(*), status FROM access_logs GROUP BY status
Flink SQL поддерживает не просто подключение к различным внешним системам, но и обеспечивает встроенную поддержку времени событий и их обработки в избирательном порядке, объединения таблиц измерений и множество других функций аналитики больших данных. В частности, благодаря большому набору коннекторов для интеграций с различными источниками и приемниками данных, Flink может считывать сообщения в реальном времени из Kafka и Elasticsearch, а затем визуализировать результаты в наглядных дэшбордах Kibana с использованием стандартного синтаксиса SQL без строчки кода Java или Scala. Именно этот кейс мы и разберем далее, заменив Apache Kafka на полностью совместимую альтернативу Redpanda, о которой мы писали здесь.
Анализ данных с помощью современного Apache Spark
Код курса
SPARK
Ближайшая дата курса
16 декабря, 2024
Продолжительность
32 ак.часов
Стоимость обучения
96 000 руб.
Подключение к Redpanda
По умолчанию Flink SQL не предоставляет готового коннектора для потоковой платформы Redpanda. Но благодаря 100%-ной совместимости этой среды с API Apache Kafka, стандартный коннектор Kafka-Flink работает отлично. В качестве примера рассмотрим, как Flink SQL читает поток из топика Kafka и обрабатывает его с помощью потокового SQL. Результаты записываются в NoSQL-СУБД Elasticsearch и визуализируются на дэшбордах Kibana. Чтобы облегчить развертывание и тестирование этого приложения, разработчики упаковали его в Docker-файл docker-compose.yml, который можно загрузить с помощью следующих команд:
mkdir flink-sql-demo-redpanda; cd flink-sql-demo-redpanda;
wget https://raw.githubusercontent.com/patrickangeles/flink-sql-demo-redpanda/main/docker-compose.yml
В отличие от Apache Kafka, Redpanda использует протокол RAFT для обеспечения консенсуса в кластере вместо Zookeeper. Поэтому при замене Kafka и Zookeeper на Redpanda следует обновить граф зависимостей сервисов. Декларация сервиса Redpanda в файле docker-compose.yml выглядит следующим образом:
redpanda:
image: docker.vectorized.io/vectorized/redpanda:v21.8.1
command:
— redpanda start
— —smp 1
— —memory 512M
— —overprovisioned
— —node-id 0
— —set redpanda.auto_create_topics_enabled=true
— —kafka-addr INSIDE://0.0.0.0:9094,OUTSIDE://0.0.0.0:9092
— —advertise-kafka-addr INSIDE://kafka:9094,OUTSIDE://localhost:9092
hostname: kafka
ports:
— «9092:9092»
— «9094:9094»
volumes:
— /var/lib/redpanda/data
Поясним некоторые параметры этой декларации: Redpanda следует модели буферизации потока на ядре CPU, по возможности используя все доступные ресурсы хоста. Это подходит для развертывания в production, но усложняет жизнь разработчику при создании прототип на офисном ноутбуке. Первые три параметра, упомянутые ниже, являются флагами запуска, которые сообщают Redpanda о разделении ресурсов с другими процессами на общем хосте или виртуальной машине. В частности, команда —smp 1 разрешает Redpanda использовать только одно логическое ядро, а —memory 512M ограничивает потребление памяти до 512 М. В качестве альтернативы можно указать —reserve-memory N, что позволит Redpanda захватить всю доступную память, но зарезервировать N мегабайт для операционной системы и других процессов. Команда —overprovisioned указывает Redpanda, что на хосте работают другие процессы, чтобы потоковая платформа уменьшила не занимала своими потоками полностью весь ЦП или память.
Рассмотрим другие параметры:
- —node-id 0 — обязательный параметр, идентификатор узла кластера (брокера) Redpanda, который сохраняется после перезапуска;
- —set redpanda.auto_create_topics_enabled = true эквивалентна разрешению автоматического создания топика в Apache Kafka с помощью конфигурации auto.create.topics.enable = true;
- hostname: kafka — в Docker Compose имя хоста по умолчанию основано на имени сервиса. Чтобы обеспечить совместимость с объявлением коннектора в демонстрационном примере, необходимо переопределить это с помощью hostname: kafka;
- volume:/var/lib/redpanda/data – путь к каталогу данных Redpanda по умолчанию, для которого Docker Compose должен сделать том доступным.
Таким образом, использование Redpanda для поиска событий и Flink SQL для потоковой обработки позволяет быстро реализовать распределенное приложение аналитики больших данных. А поддержка встроенных преобразований WebAssembly (WASM) дает разработчикам возможность преобразовывать данные на любом языке программирования, просто развернув двоичный файл WASM с помощью одной CLI-команды. Преобразования WASM выполняются внутри кластера Redpanda, снижая потребность в дополнительных вычислительных кластерах, таких как Apache Flink или Spark. В итоге можно выполнять все базовые операции потоковой передачи средствами одного фреймворка Redpanda, что уменьшит объем передаваемых данных и повысить скорость их обработки.
В заключение отметим, что при всех преимуществах Redpanda, популярность этой платформы намного ниже, чем у Apache Kafka. Поэтому прежде чем использовать этот инструмент в рабочих решениях, его следует тщательно протестировать. А вместо Flink возможно применение другого популярного Big Data фреймворка — Apache Spark, который также имеет SQL-модуль и средства пакетной и потоковой обработки данных практически в реальном времени.
Apache Kafka для инженеров данных
Код курса
DEVKI
Ближайшая дата курса
20 января, 2025
Продолжительность
24 ак.часов
Стоимость обучения
72 000 руб.
Разобраться с этими технологиями на практике, а также освоить другие особенности разработки распределенных приложений аналитики больших данных с Apache Kafka, а также Spark, Flink и другими компонентами экосистемы Hadoop, вам помогут специализированные курсы в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
- Apache Kafka для разработчиков
- Основы Apache Spark для разработчиков
- Анализ данных с Apache Spark
- Потоковая обработка в Apache Spark
- Hadoop для инженеров данных
Источники
- https://vectorized.io/blog/redpanda-flink-docker/
- https://flink.apache.org/2020/07/28/flink-sql-demo-building-e2e-streaming-application