Реальний потік даних: від подій користувачів до Cassandra
Вступ
Сучасні веб-додатки генерують величезну кількість даних про взаємодії користувачів. Захоплення та аналіз цих даних в реальному часі може надати цінні інсайти щодо поведінки користувачів. У цьому проекті я зосередився на трансляції подій користувачів з веб-додатку магазину книг до Apache Cassandra для постійного зберігання. Потік даних використовує Apache Kafka для стрімінгу подій і Apache Spark для обробки в реальному часі.
Огляд проекту
Проект складається з наступних компонентів:
- Веб-додаток магазину книг: Веб-додаток на Flask, що симулює магазин книг. Він генерує події користувачів, такі як
description_open
,description_close
іpurchase
.
Веб-додаток магазину книг на Flask
-
Apache Kafka: Розподілена платформа для стрімінгу, що виступає як брокер повідомлень для подій користувачів.
-
Apache Spark: Двигун для обробки в реальному часі, що споживає події з Kafka та обробляє їх.
-
Apache Cassandra: Високошвидкісна NoSQL база даних, що використовується для зберігання оброблених подій.
-
Docker Compose: Всі компоненти контейнеризовані та оркестровані за допомогою Docker Compose для легкості налаштування та розгортання.
Архітектура
Ось загальний огляд архітектури:
- Взаємодія з користувачем: Користувачі взаємодіють з веб-додатком магазину книг, генеруючи події, такі як
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. Веб-додаток магазину книг
Веб-додаток на Flask симулює магазин книг.
Перекладено з: Wagon Accessories and their classification for Passenger and Goods Car