Стрімінг подій користувачів у реальному часі: від веб-додатку книгарні до Cassandra за допомогою Kafka та Spark

pic

Реальний потік даних: від подій користувача до Cassandra

Вступ

Сучасні веб-додатки генерують величезну кількість даних про взаємодії користувачів. Збирання та аналіз цих даних у реальному часі може дати цінні відомості про поведінку користувачів. У цьому проекті я зосередився на потоку подій користувачів з веб-додатку Bookstore до Apache Cassandra для постійного зберігання. Потік використовує Apache Kafka для трансляції подій і Apache Spark для обробки в реальному часі.

Огляд проекту

Проект складається з таких компонентів:

  1. Веб-додаток Bookstore: веб-додаток на Flask, що імітує книжковий магазин. Він генерує події користувача, такі як description_open, description_close і purchase.

pic

Веб-додаток Bookstore на Flask

  1. Apache Kafka: розподілена платформа для трансляції подій, яка виступає в ролі брокера повідомлень для подій користувачів.

  2. Apache Spark: движок для обробки в реальному часі, який споживає події з Kafka і обробляє їх.

  3. Apache Cassandra: високо масштабована NoSQL база даних для зберігання оброблених подій.

  4. Docker Compose: усі компоненти контейнеризовані та оркестровані за допомогою Docker Compose для легкості налаштування та розгортання.

Архітектура

Ось загальний огляд архітектури:

  1. Взаємодія користувача: Користувачі взаємодіють з веб-додатком Bookstore, генеруючи події, такі як description_open, description_close і purchase.
  2. Трансляція подій: Ці події публікуються в теми Kafka.
  3. Обробка в реальному часі: Apache Spark споживає події з Kafka, обробляє їх і записує результати в Cassandra.
  4. Зберігання даних: Оброблені події зберігаються в 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, щоб переконатися, що дані записуються правильно.

pic

Таблиця подій в Cassandra, заповнена подіями користувачів

Не соромтеся ознайомитися з GitHub репозиторієм проекту для повного коду та інструкцій по налаштуванню.

Перекладено з: Real-Time User Event Streaming: From Bookstore Web App to Cassandra with Kafka and Spark

Leave a Reply

Your email address will not be published. Required fields are marked *