Secondo progetto per il corso di Big Data durante A.A. 2020/2021. Progetto che si incentra sulla creazione di una architettura lambda per effettuare analisi streaming e batch su dati estratti dalla piattaforma Twitch.
- Obiettivi
- Dataset
- Requirements
- Struttura del progetto
- Come eseguire il codice
- Possibili problemi e soluzioni
Qui di seguito sono elencati i task che questo progetto deve essere in grado di svolgere. I task si dividono in due tipologie di analisi: streaming e batch. La prima analizza i dati provenienti dalle sorgenti in near-real-time mentre l'analisi batch esegue delle analisi periodiche prelevando i dati dal database noSQL.
- Analisi delle visualizzazioni per ogni streaming:
- Analisi delle visualizzazioni correnti per ogni streaming generandone una classifica;
- Analisi delle visualizzazioni medie per ogni streaming generandone una classifica;
- analisi del numero degli streaming attivi per ogni categoria al fine di determinare i giochi in tendenza;
- analisi degli streaming al fine di determinare una percentuale delle persone che guardano lo streaming rispetto al totale degli iscritti.
- Analizzare qual è la piattaforma (PS4, Xbox o Pc) preferita dagli streamer;
- classificare per ogni Streamer le categorie preferite dai propri iscritti;
- produrre una Top 25 dei giochi e degli streamer più seguiti dagli utenti della piattaforma in ogni mese.
I dati utilizzati per simulare il crawling streaming sono stati presi dalla repository github https://clivecast.github.io. In questo link è presente anche una descrizione dettagliata di tutti i campi dei vari file.
Per simulare il crawling dei dati dalla piattaforma Twitch si usa lo script kafka_producer.py
che preleva le righe dai file presenti nella cartella /twitch_data
e li carica su kafka con il seguente formato json:
{'stream_id':stream_id, 'current_view':current_view, 'stream_created_time':stream_created_time, 'game_name':game_name, 'broadcaster_id':broadcaster_id, 'broadcaster_name':broadcaster_name, 'delay_settings':delay_settings, 'follower_number':follower_number, 'partner_status':partner_status, 'broadcaster_language':broadcaster_language, 'total_view_broadcaster':total_view_broadcaster, 'language':language, 'broadcaster_created_time':broadcaster_created_time, 'playback_bitrate':playback_bitrate, 'source_resolution':source_resolution, 'current_time':current_time}
Per la replicazione di questo progetto sono richiesti i seguenti software:
- Python 3.8.10
- Java 8
- Hadoop 3.2.2
- Spark 3.1.1
- Kafka 2.13-2.8.0
- MongoDB 5.0.0
Per l'esecuzione degli script è necessario avere installato il pacchetto gnome-terminal
:
sudo apt install gnome-terminal
Le librerie Python necessarie per far funzionare il progetto sono elencate in requirements.txt:
- kafka-python==2.0.2
- py4j==0.10.9
- pymongo==3.12.0
- pyspark==3.1.2
Per poter funzionare il progetto deve essere strutturato come segue:
/twitch-big-data-analysis
|-- /batch_jobs
|-- /dataset
| |-- /broadcaster
| |-- /dashboard
| |-- /samples
| | |-- /dashboard_sample
| | -- /twitch_data_sample
| -- /twitch_data
-- /streaming_jobs
|-- /pyspark_sql
-- /pyspark_streaming
in particolare:
- /batch_jobs contiene file di script di esecuzione dei job in batch;
- /dataset è la cartella contente i dataset scaricabili qui;
- /streaming_jobs contiene file di script di esecuzione dei job in streaming.
Inoltre vi è una directory denominata /report che contiene la presentazione e il report da consegnare per la valutazione del progetto.
Per prima cosa bisogna avviare i servizi di Kafka
$KAFKA_HOME/bin/zookeeper-server-start.sh $KAFKA_HOME/config/zookeeper.properties
$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties
e di MongoDB
$MONGO_HOME/bin/mongod --dbpath $MONGO_HOME/data --logpath $MONGO_HOME/logs/mongo.log
Successivamente si procede con la creazione del topic twitch
$KAFKA_HOME/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic twitch
Alcuni script in questo progetto fanno uso di Spark che viene eseguito su ambiente Hadoop; a tal motivo è necessario avviare i servizi di Hadoop prima di procedere con l'esecuzione del programma.
$HADOOP_HOME/bin/hdfs namenode -format
$HADOOP_HOME/sbin/start-dfs.sh
A questo punto è possibile avviare l'esecuzione eseguendo il file start.sh
:
./start.sh
All'interno della repoitory è presente un file start-all.sh
(funzionante solo su ubuntu, per utilizzarlo su MacOS è necessario installare il pacchetto gnome-terminal
) che permette di automatizzare questo processo di avvio di tutti i servizi appena elencati:
./start-all.sh
Attenzione! Assicurarsi di aver aggiunto correttamente i vari framework al PATH e di aver dato i permessi di esecuzione al file start.sh
o start-all.sh
(in caso contrario è possibile usare il comando chmod u+w start.sh
oppure chmod u+w start-all.sh
).
In questa sezione è presente una breve guida alla risoluzione dei problemi riscontrati durante l'esecuzione del progetto.
Una possibile soluzione è quella di non salvare i temp su hdfs ma di farlo in locale aggiungendo l'attributo .option("checkpointLocation", "/tmp/vaquarkhan/checkpoint")
a ReadStream
come mostrato qui.
Prima di tutto prova a riavviare il computer (anche più volte). Questo azzererà i file temporanei permettendo un format più pulito. Se non dovesse funzionare provare con la guida qui di seguito.
Un problema che si è presentato durante la prima esecuzione degli script di streaming è stato l'impossibilità di scrivere sul file temporaneo tmp a causa della mancata esecuzione del DataNode:
There are 0 datanode(s) running and 0 node(s) are excluded in this operation.
In accordo con quanto scritto qui (o qui)si consiglia di eliminare la cartella tmp di hadoop seguedo i seguenti passaggi:
- fermare hadoop
- pulire i file temporanei:
sudo rm -R /tmp/*
- eliminare e ricreare /app/hadoop/tmp (<hadoop user> dovrebbe coincidere con il nome dell'user che crea il namenode. Invocare
$USER
sul terminale per vedere il nome corrente):
sudo rm -r /app/hadoop/tmp
sudo mkdir -p /app/hadoop/tmp
sudo chown <hadoop user>:<hadoop user> /app/hadoop/tmp
sudo chmod 750 /app/hadoop/tmp
- eseguire il format del namenode:
hdfs namenode -format
Per togliere la safe mode basta invocare il seguente comando come viene spiegato qui:
bin/hadoop dfsadmin -safemode leave