Реальний потік даних: від подій користувача до Cassandra
Вступ
Сучасні веб-додатки генерують величезну кількість даних про взаємодії користувачів. Збирання та аналіз цих даних у реальному часі може дати цінні відомості про поведінку користувачів. У цьому проекті я зосередився на потоку подій користувачів з веб-додатку Bookstore до Apache Cassandra для постійного зберігання. Потік використовує Apache Kafka для трансляції подій і Apache Spark для обробки в реальному часі.
Огляд проекту
Проект складається з таких компонентів:
- Веб-додаток Bookstore: веб-додаток на Flask, що імітує книжковий магазин. Він генерує події користувача, такі як
description_open
,description_close
іpurchase
.
Веб-додаток Bookstore на Flask
-
Apache Kafka: розподілена платформа для трансляції подій, яка виступає в ролі брокера повідомлень для подій користувачів.
-
Apache Spark: движок для обробки в реальному часі, який споживає події з Kafka і обробляє їх.
-
Apache Cassandra: високо масштабована NoSQL база даних для зберігання оброблених подій.
-
Docker Compose: усі компоненти контейнеризовані та оркестровані за допомогою Docker Compose для легкості налаштування та розгортання.
Архітектура
Ось загальний огляд архітектури:
- Взаємодія користувача: Користувачі взаємодіють з веб-додатком Bookstore, генеруючи події, такі як
description_open
,description_close
іpurchase
. - Трансляція подій: Ці події публікуються в теми Kafka.
- Обробка в реальному часі: Apache Spark споживає події з Kafka, обробляє їх і записує результати в Cassandra.
- Зберігання даних: Оброблені події зберігаються в Cassandra для подальшого аналізу або запитів.
Налаштування Docker Compose
Усі інструменти та сервіси контейнеризовані за допомогою Docker Compose. Ось файл docker-compose.yml
:
version: '3.1'
services:
zookeeper:
image: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
kafka:
image: 'bitnami/kafka:latest'
container_name: kafka
ports:
- '9092:9092'
- '9093:9093'
environment:
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092
- KAFKA_ADVERTISED_HOST_NAME=kafka
kafka-ui:
image: provectuslabs/kafka-ui:latest
depends_on:
- kafka
container_name: kafka-ui
ports:
- "8080:8080"
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
KAFKA_CLUSTERS_0_ZOOKEEPER: zookeeper:2181
spark-master:
image: bitnami/spark:latest
command: bin/spark-class org.apache.spark.deploy.master.Master
ports:
- "9090:8080"
- "7077:7077"
networks:
- confluent
spark-worker:
image: bitnami/spark:latest
command: bin/spark-class org.apache.spark.deploy.worker.Worker spark://spark-master:7077
depends_on:
- spark-master
environment:
SPARK_MODE: worker
SPARK_WORKER_CORES: 2
SPARK_WORKER_MEMORY: 1g
SPARK_MASTER_URL: spark://spark-master:7077
networks:
- confluent
cassandra:
image: cassandra:latest
container_name: cassandra-container
ports:
- "9042:9042"
environment:
- CASSANDRA_USER=admin
- CASSANDRA_PASSWORD=admin
volumes:
- cassandra-data:/var/lib/cassandra
volumes:
cassandra-data:
networks:
confluent:
Покрокова реалізація
1. Веб-додаток Bookstore
Веб-додаток на Flask імітує книжковий магазин.
Він генерує такі події користувача:
description_open
: коли користувач відкриває опис книги.description_close
: коли користувач закриває опис книги.purchase
: коли користувач купує книгу.
Ці події публікуються в теми Kafka за допомогою продюсера Kafka.
Розгортання Flask додатку
Переконайтеся, що бібліотека confluent-kafka
встановлена для інтеграції з Kafka.
pip install confluent-kafka
Запустіть Flask додаток локально або в Docker контейнері.
python bookstore/producer/bookstore.py
2. Налаштування Kafka
Kafka виступає в ролі центрального брокера повідомлень. Вона отримує події з веб-додатку і робить їх доступними для споживання Spark.
Використовуйте Docker Compose для запуску Kafka та Zookeeper.
docker-compose up -d zookeeper kafka
Створіть теми для подій (description_open
, description_close
, purchase
).
docker exec -it kafka kafka-topics.sh --create --topic bookstore_events --bootstrap-server kafka:9092 --partitions 1 --replication-factor 1
Перегляньте список тем, щоб переконатися, що вони були створені успішно.
docker exec -it kafka kafka-topics.sh --list --bootstrap-server kafka:9092
3. Spark Streaming
Apache Spark споживає події з Kafka в реальному часі. Він обробляє дані (наприклад, фільтрація, агрегація) і записує результати в Cassandra.
Використовуйте Docker Compose для запуску кластера Spark.
docker-compose up -d spark-master spark-worker
Запустіть Spark Streaming додаток для споживання подій з Kafka і їх обробки. Подайте задачу в кластер Spark.
python bookstore/consumer/spark-stream-casasndra.py
4. Зберігання в Cassandra
Cassandra використовується для зберігання оброблених подій. Її розподілений характер забезпечує високу доступність і масштабованість.
Використовуйте Docker Compose для запуску Cassandra.
docker-compose up -d cassandra
Підключіться до контейнера Cassandra і створіть простір для зберігання та таблицю для зберігання подій.
docker exec -it cassandra-container cqlsh -u admin -p admin
CREATE KEYSPACE bookstore WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};
USE bookstore;
CREATE TABLE events (
event_id UUID PRIMARY KEY,
event_type TEXT,
event_time TIMESTAMP,
user_id TEXT,
book_id TEXT
);
Запитайте таблицю events
, щоб переконатися, що дані записуються правильно.
Таблиця подій в Cassandra, заповнена подіями користувачів
Не соромтеся ознайомитися з GitHub репозиторієм проекту для повного коду та інструкцій по налаштуванню.
Перекладено з: Real-Time User Event Streaming: From Bookstore Web App to Cassandra with Kafka and Spark