services: kafka: image: bitnami/kafka:latest container_name: kafka environment: - KAFKA_CFG_PROCESS_ROLES=broker,controller - KAFKA_CFG_NODE_ID=1 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true ports: - "9092:9092" healthcheck: test: ["CMD-SHELL", "kafka-topics.sh --bootstrap-server localhost:9092 --list"] interval: 30s timeout: 10s retries: 5 start_period: 60s networks: - kafka-network sentiment-producer: container_name: sentiment-producer build: . depends_on: kafka: condition: service_healthy command: ["python", "mock_tweet_producer.py"] restart: on-failure networks: - kafka-network spark: image: bitnami/spark:3.4 container_name: spark environment: - SPARK_MODE=master - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no ports: - "4040:4040" - "7077:7077" depends_on: kafka: condition: service_healthy networks: - kafka-network spark-worker: image: bitnami/spark:3.4 container_name: spark-worker environment: - SPARK_MODE=worker - SPARK_MASTER_URL=spark://spark:7077 - SPARK_RPC_AUTHENTICATION_ENABLED=no - SPARK_RPC_ENCRYPTION_ENABLED=no - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no - SPARK_SSL_ENABLED=no depends_on: - spark networks: - kafka-network sentiment-consumer: image: bitnami/spark:3.4 container_name: sentiment-consumer depends_on: kafka: condition: service_healthy spark: condition: service_started spark-worker: condition: service_started command: ["spark-submit", "--master", "spark://spark:7077", "--packages", "org.apache.spark:spark-sql-kafka-0-10_2.12:3.4.0", "/app/consumer.py"] volumes: - .:/app restart: on-failure networks: - kafka-network dashboard: container_name: dashboard build: . depends_on: kafka: condition: service_healthy command: ["python", "dashboard.py"] ports: - "5000:5000" restart: on-failure networks: - kafka-network networks: kafka-network: driver: bridge