.PHONY: bootstrap up down streaming simulate demo test logs clean bootstrap: @echo "Running ALS bootstrap (downloads MovieLens 1M if needed)…" docker compose run --rm spark python /opt/spark-jobs/bootstrap.py streaming: @echo "Starting Spark Structured Streaming job…" docker compose exec -d spark python /opt/spark-jobs/streaming.py @echo "Streaming started in background. Check logs: make logs" up: docker compose up -d @echo "" @echo " Frontend → http://localhost:3000" @echo " API → http://localhost:8000" @echo " Grafana → http://localhost:3001 (admin/admin)" down: docker compose down simulate: docker compose exec event-simulator python simulator.py --users 10 --events 100 demo: @xdg-open http://localhost:3000 2>/dev/null || open http://localhost:3000 2>/dev/null || \ echo "Open http://localhost:3000" test: uv run pytest tests/ -v logs: docker compose logs -f spark event-simulator api clean: docker compose down -v rm -rf data/ml-1m data/ml-1m.zip