Tesi Kafka Spark
Tesi Kafka Spark
Architetture di elaborazione
dati in streaming per analisi e
previsione di serie temporali
Relatore Candidato
Prof. Luca Ardito Alberto Conti
Supervisore aziendale
Blue Reply
Dott. Andrea Bardone
5
Indice
1 Introduzione 13
1.1 Continuous Intelligence e Big Data . . . . . . . . . . . . . 13
1.2 Architetture streaming . . . . . . . . . . . . . . . . . . . . 14
2 Progettazione dell’infrastruttura 21
2.1 Data ingestion . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.1.1 Apache NiFi . . . . . . . . . . . . . . . . . . . . . . 23
2.1.2 Wavefront . . . . . . . . . . . . . . . . . . . . . . . 24
2.2 Message Broker . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2.1 Apache RabbitMQ . . . . . . . . . . . . . . . . . . 26
2.2.2 Apache Kafka . . . . . . . . . . . . . . . . . . . . . 26
2.3 Data Processing . . . . . . . . . . . . . . . . . . . . . . . . 28
2.3.1 Spark streaming . . . . . . . . . . . . . . . . . . . . 29
2.3.2 Flink . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.4 Data Storage . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4.1 MongoDB . . . . . . . . . . . . . . . . . . . . . . . 31
2.4.2 Cassandra . . . . . . . . . . . . . . . . . . . . . . . 31
2.5 Resoconto Architettura . . . . . . . . . . . . . . . . . . . . 32
3 Realizzazione dell’infrastruttura 35
3.1 Data source . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.1.1 Alpha Vantage . . . . . . . . . . . . . . . . . . . . 36
3.1.2 Twitter . . . . . . . . . . . . . . . . . . . . . . . . 37
3.2 Sentiment Analysis . . . . . . . . . . . . . . . . . . . . . . 38
6
3.2.1 VADER . . . . . . . . . . . . . . . . . . . . . . . . 40
3.3 Processori NiFi . . . . . . . . . . . . . . . . . . . . . . . . 40
3.4 MiNiFi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.5 Kafka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.6 Flink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.7 Cassandra . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3.8 Conseguenze shut down . . . . . . . . . . . . . . . . . . . 54
5 Conclusioni 91
Bibliografia 93
7
Elenco delle tabelle
2.1 Concetti su cui si basa NiFi che rispecchiano l’idea di una
FBP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.1 Statistiche per i predictors, simple data . . . . . . . . . . . 62
4.2 Statistiche per i predictors, data hourly . . . . . . . . . . 67
8
Elenco delle figure
1.1 Catena per estrarre informazioni dai Big Data. [8] . . . . 15
1.2 Diagramma architettura Lambda. [9] . . . . . . . . . . . . 16
1.3 Framework per analisi in tempo reale di uno streaming di
tweet. [11] . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
1.4 Architettura per acquisizione e analisi dati in applicazioni
IoT. [12] . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.1 Struttura per un’analisi in tempo reale. [13] . . . . . . . . 22
2.2 Schema che mostra un cluster con più broker, con un singolo
nodo. [23] . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.3 Componenti principali adottati. . . . . . . . . . . . . . . . 33
3.1 Risposta di Alpha Vantage a una chiamata API intraday. 37
3.2 Alcune parole con il relativo valore di sentiment. Prima è
indicata la media e la varianza, poi 10 valori che sono stati
attribuiti alla parola corrispondente in contesti differenti. 41
3.3 Flusso completo di processi NiFi utilizzati per trasformare
i dati ottenuti da Alpha Vantage e consegnarli a Kafka. . 41
3.4 Impostazioni di scheduling per il processore InvokeAlpha0. 43
3.5 Dettagli processore EvaluateJsonPath. . . . . . . . . . . . 44
3.6 Flusso di processori NiFi che portano le informazioni da
Twitter a Kafka. . . . . . . . . . . . . . . . . . . . . . . . 45
3.7 Proprietà processore personalizzato per l’ingestion da Twit-
ter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.8 Codice per effettuare una sentiment analysis in python. . 47
3.9 File .nar aggiunti nella libreria di MiNiFi. . . . . . . . . . 49
3.10 Visualizzazione grafica del comportamento tumbling-windows
di flink. Lo stream è semplicemente diviso in finestre di una
data ampiezza, è anche possibile che in determinate finestre
non ci siano dati. [40] . . . . . . . . . . . . . . . . . . . . 50
9
3.11 Visualizzazione grafica del comportamento sliding-windows
di flink. Ogni finestra ha una durata temporale fissa e
ad ogni slittamento possono generarsi sovrapposizioni se
windows size è inferiore a window size. [40] . . . . . . . . 52
3.12 Schema di processori NiFi che attingono dati da Kafka e li
inseriscono in Cassandra. . . . . . . . . . . . . . . . . . . 55
4.1 Frammento di un singolo dato dal topic joinedDataSimple.
I valori corrispondo a: data, timestamp, sentiment, numero
tweet, exchange rate. . . . . . . . . . . . . . . . . . . . . 61
4.2 Heatmap della correlazione delle variabili caso simple. . . 62
4.3 Confronto dei valori delle features con il trend del Bitcoin. 63
4.4 Frammento di un singolo dato dal topic joinedDataHourly.
I valori corrispondo a: data, timestamp, sentiment, numero
tweet, media, varianza, open, close, low, high, RSI. . . . . 66
4.5 Confronto tra gli indici LWMA e SMMA che tra i pun-
ti di intersezione individuano gruppi di trend crescente e
decrescente. . . . . . . . . . . . . . . . . . . . . . . . . . . 66
4.6 Matrice di correlazione tra le variabili del topic dataHourly. 67
4.7 Confronto dei valori delle features con dati ogni ora. . . . 68
4.8 Sopra, l’andamento del Bitcoin e il logaritmo dello stesso.
Sotto, il grafico dei residui della controparte superiore. . . 72
4.9 Codice per applicare il modello ARIMA testando le varie
combiazioni di parametri. . . . . . . . . . . . . . . . . . . 73
4.10 In ogni riga è indicata la data, il timestamp, l’exchange
rate, la previsione effettuata due minuti prima per quell’i-
stante, i parametri del modello nell’effettuare la previsione
precedente, il previsione fatta un ora prima con i relati-
vi parametri e il valore predetto il giorno precedente con
relativi parametri. . . . . . . . . . . . . . . . . . . . . . . 74
4.11 Risultato grafico per la predizione usando il modello ARI-
MA per diverse sezioni temporali. . . . . . . . . . . . . . . 81
4.12 Accuratezza misurata tramite RMSE in ordine dall’alto ver-
so il basso, della predizione a 2 minuti, a 1 ora e 1 giorno. 82
4.13 Codice per applicare un modello LSTM (prima parte). . . 83
4.14 Codice per applicare un modello LSTM (seconda parte). . 84
4.15 Codice per applicare un modello LSTM, caso dataHourly. 85
4.16 Predizione con modello Vanilla, caso simple. . . . . . . . . 85
10
4.17 Accuratezza modello Vanilla. A sinistra l’RMSE per pro-
fondità di previsione, a destra il valore dell’RMSE step by
step. Caso simple. . . . . . . . . . . . . . . . . . . . . . . 86
4.18 A sinistra una predizione con modello vanilla standardiz-
zando considerando la totalità dei dati. A destra una pre-
dizione sempre con modello vanilla standardizzando il sen-
timent come le altre variabili. . . . . . . . . . . . . . . . . 86
4.19 Alcune predizioni usando un modello a più strati: LSTM(50)
+ dropout(0.2) + fully connected(50) + dropout(0.5) +
fully connected(720). . . . . . . . . . . . . . . . . . . . . 87
4.20 Accuratezza modello a più strati. A sinistra l’RMSE per
profondità di previsione, a destra il valore dell’RMSE step
by step. Caso simple. . . . . . . . . . . . . . . . . . . . . 87
4.21 Predizione con modello Vanilla, caso data hourly. . . . . . 88
4.22 Accuratezza modello Vanilla. A sinistra il valore dell’RMSE
step by step, a destra l’RMSE per profondità di previsione.
Caso data hourly. . . . . . . . . . . . . . . . . . . . . . . 88
4.23 Predizione con modello a più strati: LSTM(100) + dro-
pout(0.2) + fully connected(50) + dropout(0.5) + fully
connected(24). Caso data hourly. . . . . . . . . . . . . . . 89
4.24 Accuratezza modello a più strati. A sinistra il valore del-
l’RMSE step by step, a destra l’RMSE per profondità di
previsione. Caso data hourly. . . . . . . . . . . . . . . . . 89
11
12
Capitolo 1
Introduzione
1.1 Continuous Intelligence e Big Data
In questo 2020 ma soprattutto negli anni futuri, la Continuous Intelligence
(CI) vedrà uno smisurato aumento della sua applicazione, che diventerà
uno standard nell’ambito aziendale [4]. Si tratta di un analisi che elabo-
ra oltre a dati storici anche quelli in tempo reale, per prescrivere azioni
tempestive o semplicemente per migliorare le decisioni. É un approccio
che sfrutta tecniche di machine learning per l’apprendimento ed è in grado
di basarsi su tutti i dati di cui ha bisogno, indipendentemente dalla loro
grande quantità e dalla presenza di pattern conosciuti: è un modello di
progettazione che automatizza l’analisi in modo che sia continua e senza
interruzioni. La sua definizione si potrebbe confondere con il concetto di
Business Intelligence (BI), la differenza sta nel fatto che gli strumenti di BI
non coinvolgono il machine learning o l’AI. La BI si basa fortemente sulle
competenze e ci si aspetta che gli esperti di dati guidino tale strumento in
ogni fase del flusso di lavoro, direttamente dall’estrazione dei dati e dal-
l’integrazione attraverso l’interpretazione. Inoltre, a differenza della CI,
BI non è stato ideato per velocizzare l’accesso a dati e informazioni.
Figura 1.1: Catena per estrarre informazioni dai Big Data. [8]
da invidiare ad altri sistemi, se non che non sia appropriato per lo stream
processing. É necessaria quindi un’architettura alternativa in grado di ela-
borare flussi di dati in tempo-reale, mantenendo una bassa latenza. Tra
le varie possibilità esistono due principali architetture che soddisfano le
nostre necessità: Lambda e Kappa.
Lambda è un framework per gestire grandi quantità di dati, progettato
da Nathan Marz con l’idea di creare un sistema che usi contemporanea-
mente il batch processing e il real-time processing. La figura 1.2 mostra
la rappresentazione di questo sistema suddividendolo in tre diversi layer.
1. Batch layer. Ha il compito di archiviare in memoria l’intero da-
taset, tenedolo aggiornato con l’arrivo dei nuovi dati in real-time e
correggendo eventuali errori nello streaming. Rappresenta il livello
affidabile e si serve di data warehouse tradizionale.
2. Serving layer. É in grado di ridurre la latenza del sistema, comuni-
cando con il batch layer tramite opportune query ad-hoc eseguibili in
tempo reale. Questo livello può essere realizzato con database NOSQL
come Cassandra o HBase.
3. Speed layer. Si occupa di gestire gli ultimi dati generati, mettendo la
bassa latenza sopra alla precisione. Si serve di algoritmi veloci per la
generazione di viste incrementali. Dei possibili framework applicabili
a questo layer possono essere Apache Storm e Spark Streaming.
Passiamo ora ad analizzare Kappa, l’architettura software ideata da Jay
Kreps. Riesce ad elaborare dati sia in tempo reale che in batch, ma la sua
15
Introduzione
19
20
Capitolo 2
Progettazione
dell’infrastruttura
Innanzitutto individuiamo quali sono i componenti fondamentali di un
architettura in streaming che porta dalla cattura dati in tempo reale al-
l’analisi finale. La figura 2.1 mostra alcuni degli elementi chiave necessari
per l’analisi che ci interessa. Primo tra tutti è il blocco che rappresenta la
fonte dei dati, come può essere un sito o un database da cui attingeremo
tutte le informazioni necessarie in tempo reale. Successivamente, sapendo
da dove attingere i dati, sarà necessario un data ingestion, seguito da un
data storage, da cui potrà usufruire un data processing, che per il nostro
scopo avrà bisogno di un integrazione per il machine learning. Andiamo
ad analizzare per ognuno di questi blocchi, quali potrebbero essere dei
buoni componenti.
.
2.1.2 Wavefront
Wavefront è una piattaforma ospitata per l’importazione, l’archiviazione,
la visualizzazione e l’avviso su dati metrici. Si basa su un approccio di
elaborazione del flusso inventato da Google che consente agli ingegneri di
manipolare i dati metrici con una potenza senza pari. Wavefront rende
l’analisi semplice ma potente; Il nostro linguaggio di query consente di
manipolare i dati delle serie storiche in modi mai visti prima di nbsp;
Il linguaggio è di facile comprensione, ma abbastanza potente da gestire
dati ad alta dimensione. Wavefront può ingerire milioni di punti dati al
secondo. Sfruttando un linguaggio di query intuitivo, è possibile mani-
polare i dati in tempo reale e fornire informazioni fruibili. Questo aiuta
ad affrontare la consegna delle applicazioni: ridurre i tempi di inattivi-
tà delle applicazioni, rilevare e riparare i problemi molto rapidamente.
Cloud Scale: monitora le prestazioni SaaS e software attraverso i servizi
cloud e on-premise. Analitica operativa: abbatti i silos di dati e migliora.
Collaborazione DevOps. Ottieni una vista a 360 ° su IT nbsp; infrastrut-
tura, allineare l’IT con il business e ottenere efficienze. Grande gestione
dei dati: ricerca, esplorazione, navigazione, navigazione, analisi, correla-
zione e visualizzazione di milioni di punti dati al secondo da ogni parte
dell’azienda.
24
2.2 – Message Broker
popolari per l’elaborazione dei big data utilizzando cluster su larga scala.
MapReduce è un framework brevettato da Google e sviluppato da Yahoo.
Le funzioni Map e Reduce sono programmate per elaborare i big data di-
stribuiti su più nodi eterogenei. Il vantaggio principale di questo modello
di programmazione è la semplicità, quindi gli utenti possono facilmente
utilizzarlo per l’elaborazione dei big data [20]. Tra i possibili framework
di processing, analizziamo Spark streaming e Flink.
2.3.2 Flink
Flink è un framework e motore di elaborazione distribuito. I dati da lui
utilizzati sono prodotti come stream di eventi, ad esempio transazioni di
carte di credito, misure di sensori, log, interazione utenti... Esistono due
tipologie di stream che è in grado di gestire:
• Ogni record non deve avere una struttura fissa, lo schema non deve
essere definito prima dell’inserimento e l’aggiunta di nuove proprietà
al volo è ammissibile, potendo lavorare così con schemi flessibili e
dinamici.
• I dati non devono essere normalizzati per far si che non ci siano
incongruenze o ridondanze.
2.4.1 MongoDB
MongoDB è un database non relazionale incentrato sui documenti, file si-
mili a JSON che possono vantare molti tipi di strutture che possono essere
dinamiche. Risulta molto veloce, non avendo uno schema può immagazzi-
nare un documento senza prima definirvi una struttura. I documenti sono
come i record di un RDBMS e possono essere modificati a piacimento.
Usa un suo proprio linguaggio di query, e per rendere più efficienti le ri-
cerche è bene sfruttare le chiavi, altrimenti controllare l’intero documento
potrebbe essere dispendioso. MongoDB possiede un set di repliche inte-
grate, quando il database primario non è disponibile inverte il suo ruolo
con quello secondario, questo richiede del tempo (tra i 10 e i 40 secondi)
nel quale non è possibile scrivere sulle repliche. Se ci sono più repliche una
assume un ruolo principale e le operazioni di letture e scritture vengono
effettuate prima rispetto a tutte le altre repliche che sono considerate se-
condarie. Per le scritture in parallelo, Mongo ha a disposizione un singolo
nodo principale che funge da master, per cui le capacità di quel singolo
nodo determinano i limiti di velocità del database. [22]
2.4.2 Cassandra
Apache Cassandra è un database NoSQL distribuito, la sua forza risiede
nel saper gestire grandi quantità di dati non strutturati, avendo la capa-
cità di poter essere espanso orizzontalmente senza grandi sforzi. Ha uno
schema simile a database relazionali con righe e colonne. Ogni riga ha
una chiave univoca e il numero di colonne può essere variabile da dato
31
Progettazione dell’infrastruttura
32
2.5 – Resoconto Architettura
Figura 2.2: Schema che mostra un cluster con più broker, con un singolo
nodo. [23]
33
Progettazione dell’infrastruttura
Realizzazione
dell’infrastruttura
Per la realizzazione di questo tipo di compito è fondamentale che la ri-
cezione dei dati avvenga 24/24. La strategia adottata non richiede di
accedere allo storico del trend del Bitcoin per analizzarlo e scoprire i pat-
tern che l’hanno governato nel periodo di tempo analizzato, ma ciò che
ci serve viene direttamente preso in tempo reale con tutte le successive
analisi che verranno effettuate e rimodellate nel tempo. A questo scopo
ci servirà un server sempre operativo su cui installare la nostra architet-
tura. In questo capitolo andremo ad implementare l’architettura pensata
al capitolo precedente, in modo molto generico ci si può riferire alla figura
2.3. Implementeremo passo passo tutte le funzionalità necessarie per esse-
re in grado di predire il futuro andamento del bitcoin, interlacciando i vari
componenti e continuando a garantire il corretto funzionamento anche in
presenza di guasti. Proprio per questo motivo, in aggiunta ai framework
scelti, si è preferito lasciarsi appoggiare da Apache Zookeeper. Andiamo
con ordine.
3.1.2 Twitter
Per riuscire a captare tutti i possibili tweet inerenti al bitcoin possiamo
sfruttare l’API di twitter per developers, utile per poter sfruttare le tec-
nologie che hanno a che fare coi tweet. Tutti i dettagli possono essere
consultati nella documentazione messa a disposizione da Twitter [27]. A
noi interessa riuscire ad ottenere un flusso continuo di tweet servendosi di
un client che faccia delle richieste sfruttando il protocollo HTTP. Esistono
3 modi per accedere ai dati di twitter:
• Search API
• Streaming API
37
Realizzazione dell’infrastruttura
• Firehose
Shearch API permette di accedere all’interro archivio dei tweet già esi-
stenti, con la possibilità inserire dei filtri attraverso un qualche criterio di
ricerca che permette di specificare parole chiave, posizioni geografiche e
specifici username. Il numero di richieste da poter rivolgere all’API nel-
l’arco di una finestra di tempo (15 minuti) è limitato, a seconda del tipo
di richiesta, inoltre esistono tre livelli di API di cui solo il primo è free. La
limitazione consiste di quanto indietro nel tempo si possono cercare tweet.
Streaming API è in grado di servirsi di tweet che sono appena stati
generati. Anziché fornire dati in batch tramite richieste ripetute, come ci
si aspetterebbe da un’API REST, viene aperta una singola connessione e
ogni volta che un nuovo tweet combacia coi criteri di ricerca, viene inviata
la nuova risposta sempre sfruttando la connessione già creata. Ciò si
traduce in un meccanismo di consegna a bassa latenza che può supportare
una velocità effettiva molto elevata. Potenzialmente con questa strategia
si possono ricevere uno spropositato numero di tweet, considerando che
vengono scritti oltre 500 milioni di tweet al giorno, con una cadenza media
di 6000 tweet al secondo [28]. Per questo motivo in realtà è presente una
limitazione dovuta ai limiti dell’infrastruttura Twitter, che riducono le
risposte fornite solamente a un campione dei tweet, che corrisponde ad
un sottoinsieme del reale numero che ha fatto match. Alcuni studi [31]
hanno stimato che l’ammontare di tweet ricevuti si aggiri intorno all’1%
con leggere variazioni in base ai criteri di ricerca e al traffico corrente.
L’inconveniente della limitazione del numero di tweet considerati è ri-
mediabile con l’utilizzo di Twitter Firehose. Come lo Streaming API per-
mette di fornire dati real-time ma allo stesso tempo è in grado di garantire
la consegna del 100% dei tweet, grazie alla gestione di due fornitori di dati:
GNIP e DataSift. Il prezzo da pagare per questo tipo di servizio è il non
essere free, per questo motivo ci accontenteremo di usare la streaming API
tweet che farà push.
3.2.1 VADER
Per effettuare quest’operazione ci avvaleremo della VADER (Valence Aware
Dictionary and sEntiment Reasoner) Sentimant Analysis, è uno strumen-
to di analisi del sentiment basato su regole e lessico che è specificamente
in sintonia con i sentimenti espressi nei social media. É completamente
open-source sotto la licenza MIT [33]. L’algoritmo che viene sfruttato tie-
ne conto di regole grammaticali e sintattiche incorporando valori derivati
empiricamente dall’impatto di ciascuna regola sull’intensità percepita del
sentimento. Nel file "vader_lexicon" sono presenti parole e simboli (co-
me emoticon) di riferimento 3.2. Non è presente qualsiasi parola, e sono
pensate per attribuire un sentimento positivo o negativo che varia da -4
a 4. Per cercare di valutare più accuratamente il sentiment per quanto
riguarda contesti finanziari abbiano aggiunto qualche termine cardine che
altrimenti verrebbe considerato come ininfluente, alcuni esempi positivi
sono “resurgent”, “heated”, “speedy”, altri negativi possono essere “fal-
sified”, “bottleneck”, “depressing”. Per la selezione delle parole ci siamo
affidati a delle ricerche sul "market sentiment dictionary" [34] e sulla stima
di parole positive/negative per prezzi di azioni [35]
Figura 3.3: Flusso completo di processi NiFi utilizzati per trasformare i dati
ottenuti da Alpha Vantage e consegnarli a Kafka.
42
3.3 – Processori NiFi
in frammenti da due minuti, cosa che ci sarà molto utile quando avremo
a che fare con Flink. Al quarto strato di processori facciamo in modo di
filtrare solo gli attributi che ci interessano, usando i nominativi assegnati
dal processore EvaluatePath, per poi infine connettersi a Kafka al localho-
st:9092 e pubblicare sul topic "exchange" il flowfile risultante. Il topic può
essere già esistente, ma se così non fosse verrà creato seguendo la configu-
razione di Kafka in server.propreties che vedremo al capitolo successivo.
Questa volta per la connessione tra gli ultimi due processori non abbiamo
impostato nessun tempo di scadenza, perché nel caso Kafka smettesse di
funzionare, tutti i flowfile si cumulerebbero nella coda dell’ultima connes-
sione e in un secondo momento quando Kafka sarà di nuovo disponibile
tutti i file sospesi saranno recuperati evitando possibili perdite.
Figura 3.6: Flusso di processori NiFi che portano le informazioni da Twitter a Kafka.
3.4 MiNiFi
Blue Reply, l’azienda per cui sto svolgendo questa tesi, ha messo a dispo-
sizione i suoi server. É sorta però la necessità di lavorare in remoto per via
della recente quarantena dovuta al COVID-19. Abbiamo quindi utilizzato
PuTTY per emulare un terminale e gestire da VPN il server, ma per l’uso
di NiFi è necessaria l’interfaccia utente disponibile dalla porta 8080 che
ne rende semplice l’utilizzo. Per aggirare questa problematica ci siamo
affidati a MiNiFi, anche questo è un progetto Apache, usato per avere una
47
Realizzazione dell’infrastruttura
• Gli imbuti
• I gruppi di processi
3.5 Kafka
Kafka ha bisogno dell’aiuto di ZooKeeper per gestire il coordinamento tra
daversi broker. ZooKeeper è un progetto open source della Apache Soft-
ware Foundation in grado di fornire un servizio centralizzato che sia in
grado di fornire servizi di livello superiore per la sincronizzazione, mante-
nimento della configurazione e denominazione in sistemi distribuiti, anche
su cluster. É progettato per essere facile da programmare, è scritto in Java
ed è stato pensato per sollevare le applicazioni distribuite dalla responsa-
bilità di implementare i servizi di coordinamento da zero, ponendo atten-
zione a rendere affidabile l’adattamento di tutti i sistemi alle modifiche,
evitando possibili race conditions e deadlock.
3.6 Flink
All’interno dell’applicazione Flink ci sono due consumer, il primo attinge
i dati dal topic exchange di Kafka, mentre il secondo dal topic twitter.
La politica di fruizione dei dati è “latest”, in questo modo nel caso il pro-
gramma venisse fermato, al riavvio ripartirebbe a prendere dati dal topic
dalla posizione dell’ultimo offset. Infatti ogni consumer appartiene ad uno
specifico consumer-group che ha un offset personale memorizzato. Il con-
nettore usato verso Kafka è impostato con il meccanismo "exactly-once",
assicurando che ogni messaggio sia recapitato una e una sola volta, gesten-
do in un caso di perdita non ci siano record duplicati e distinguendosi così
dalla politica "at least once" in cui un messaggio può venire ritrasmesso
ma ignorando la creazione di possibili duplicati.
49
Realizzazione dell’infrastruttura
Nella prima trasformazione del flusso, ad ogni record viene associato espli-
citamente un timestamp, lo stesso già presente all’interno del record stesso
preso da Kafka. Questo permetterà a Flink di conoscere l’esatta posizio-
ne temporale che ci servirà per effettuare le operazioni che andremo ad
analizzare. Prima tra tutte: il join. L’unione tra i due flussi altro non è
che un semi-join sul timestamp, infatti un istante di tempo che non ha
corrispondenze nel flusso complementare, viene scartato. Non verranno
così a crearsi record con delle informazioni parziali, anche se in generale
non dovrebbero comunque venirsi a creare. Bisogna fare attenzione che
potenzialmente i due flussi potrebbero essere sfalsati, e non dimentichia-
moci che in quanto streaming, non hanno una fine. Se la chiave di join
fosse il numero di tweet, e volessi unire tutti i record con lo stesso am-
montare di tweet, dovrei considerare che in futuro, tra dati che ancora non
mi sono arrivati, ci possano essere record che faranno match con dati già
esistente. La lunghezza non limitata dello stream rende questa casistica
inaccettabile, per questo è necessario specificare una finestra di tempo nel
quale effettuare il join, come in figura 3.10, andando a limitare la quantità
di tempo per la quale si osservano dati con lo scopo di effettuare il join.
Ora che abbiamo ottenuto unico flusso contenete tutti i dati ricavati dal-
50
3.6 – Flink
Per il secondo topic invece faremo in modo di inserire dei dati per un
analisi leggermente diversa, che abbia a disposizione anche molte più infor-
mazioni. Se la nostra prima strategia era considerare ogni valore captato
ad ogni 2 minuti, ora continueremo a mantenere la stessa frequenza ma al-
l’interno di ogni record saranno compresse le informazioni di un intera ora.
Questa strategia punta ad essere più precisi nella predizione ad intervalli
orari, lasciando da parte le oscillazioni di periodi brevi come 2 minuti che
teoricamente nascondono al loro interno più rumore e quindi un maggior
51
Realizzazione dell’infrastruttura
3.7 Cassandra
Per il salvataggio dei dai in modo persistente ci siamo affidati a Cassan-
dra. In un primo momento, data la semplicità d’uso NiFi abbiamo preso
il contenuto dei due topic di partenza, contenenti le informazioni di Al-
pha Vantage e Twitter, e le abbiamo salvate tramite due flussi in Apache
Cassandra. La figura 3.12 mostra la panoramica dei processori utilizzati
nell’interfaccia utente di NiFI. Il primo processore è un KafkaConsumer,
prende i dati dai topic corrispondenti creando con consumer group con
politica latest. Il FlowFile generato può venire modificato per avere una
formattazione tale da renderlo un json per poter identificare gli attributi
53
Realizzazione dell’infrastruttura
57
58
Capitolo 4
Previsione serie
temporale tramite
machine learning
In questa sezione ci focalizzeremo sull’analisi dei dati a nostra disposizio-
ne, individuandone le caratteristiche per essere in grado di predire l’anda-
mento del Bitcoin tramite machine learning. L’apprendimento automatico
(ML) è una parte dell’informatica in cui l’efficienza di un sistema si miglio-
ra da sola eseguendo ripetutamente le attività basandosi sui dati anziché
essere programmata esplicitamente dai programmatori. In generale esi-
stono tre tipi di tecniche che si possono adottare, il supervised learning in
cui l’algoritmo si allena su un set di features-label per imparare a predirre
le label, l’unsupervised learning dove si cerca di comprendere la forma dei
dati per attribuire ad ognuno la sua label senza una conoscenza pregressa,
e il reinforcement learning in cui l’algoritmo interagisce con l’ambiente
ed impara a reagire nel migliore dei modi sotto ricompense e punizioni.
Per risolvere il nostro problema dobbiamo servirci della prima tecnica,
quella del supervised lerning; prevedere la label corrispondente al valore
del Bitcoin basandosi su caratteristiche come il numero di tweet e senti-
ment, avendo la possibilità di allenarsi su dati in cui quest’accoppiamento
è certo. La particolarità di questo tipo di problema è che la risposta che
vogliamo prevedere è anche una caratteristica usata per prevederla. Nella
mia carriera universitaria mi sono cimentato nell’applicazione di algoritmi
di classificazione e regressione per predire valori futuri (quindi supervised
59
Previsione serie temporale tramite machine learning
4.1 I Dati
avere una visione più chiara dei dati a nostra disposizione, la tabella4.1
mostra qualche informazione statistica sulle nostre variabili, e la figura
4.3 rappresenta un confronto tra il valore del Bitcoin e le varie features in
un range di tempo limitato (circa 7 ore). Come già anticipato dall’heat
map non c’è un evidente correlazione, inoltre i grafici dei predictors hanno
oscillazioni ancora più pronunciate.
62
4.1 – I Dati
Figura 4.3: Confronto dei valori delle features con il trend del Bitcoin.
63
Previsione serie temporale tramite machine learning
Figura 4.5: Confronto tra gli indici LWMA e SMMA che tra i punti di
intersezione individuano gruppi di trend crescente e decrescente.
67
Previsione serie temporale tramite machine learning
Figura 4.7: Confronto dei valori delle features con dati ogni ora.
68
4.2 – ARIMA
4.2 ARIMA
Un metodo statistico per la previsione delle serie temporali molto popolare
e largamente utilizzato è il modello ARIMA. È una generalizzazione della
più semplice media mobile auto-regressiva con l’aggiunta della nozione di
integrazione. I metodi ARIMA sono basati sull’assunzione che i dati del-
le serie temporali possano essere riprodotti da un modello di probabilità,
assumendo a priori che i valori futuri delle serie storiche siano correlati
ai valori ed errori passati. Un prerequisito necessario per poter utilizza-
re questo tipo di modello è che la serie temporale analizzata deve essere
stazionaria, ovvero deve avere media, varianza e funzione di autocorrela-
zione costanti. Nel caso questa proprietà non sia soddisfatta è possibile
segmentare la serie in porzioni che possono essere utilizzate come serie
stazionarie su cui applicare il modello ARIMA. Proviamo a capire meglio
questo modello partendo dal significato dell’acronimo che gli da il nome,
questo riesce a racchiuderne gli aspetti chiave:
• AR: AutoRegressive. Un modello che utilizza la relazione dipendente
tra un’osservazione e un certo numero di osservazioni ritardate.
• I: Integrated. L’uso della differenziazione delle osservazioni grezze
(ad esempio sottraendo un’osservazione da un’osservazione nella fase
temporale precedente) al fine di rendere stazionarie le serie temporali.
• MA: Moving Average. Un modello che utilizza la dipendenza tra
un’osservazione e un errore residuo a partire da un modello a media
mobile applicato alle osservazioni ritardate.
Ognuno di questi componenti è esplicitamente specificato nel modello co-
me parametro. Viene utilizzata la notazione standard di ARIMA (p, d,
q) in cui i parametri vengono sostituiti con valori interi per indicare rapi-
damente lo specifico modello ARIMA utilizzato. I parametri del modello
ARIMA sono definiti come segue:
69
Previsione serie temporale tramite machine learning
Figura 4.8: Sopra, l’andamento del Bitcoin e il logaritmo dello stesso. Sotto, il
grafico dei residui della controparte superiore.
di soluzione ottenuta dal codice in figura 4.9, dove per ogni timestamp è
fornita la previsione effettuata due minuti, un ora e un giorno prima, con
accanto segnati i parametri del modello utilizzati. Notiamo che i modelli
definitivi vedono, per le predizioni da 2 e 60 minuti, dei modelli ARMA
in cui il grado di integrazione non è necessario (uguale a zero). Questo
perché non è necessario considerare la differenza tra i dati, essendo questi
già stazionari. Inoltre, escludendo il primo modello, l’ordine dell’auto-
regressione e della media mobile varia tra 0 e 1, riducendo l’entità del
rumore introdotto nel modello.
I risultati grafici sono mostrati in figura 4.11, mentre l’errore in figu-
ra 4.12. La previsione a due minuti genera valori molto vicini all’ultimo
elemento della serie, sovrapponendosi al valore dell’exchange rate con un
73
Previsione serie temporale tramite machine learning
4.3 LSTM
A differenza del modello ARIMA precedentemente analizzato, ora cerche-
remo di tenere in considerazione, oltre al valore di exchange rate, anche
tutte le caratteristiche che abbiamo analizzato nella sezione dati. In que-
sto modo si elimina la pesante assunzione che tutti i predictors prima
non considerati influenzino il prezzo sempre nella stessa maniera. Questo
tipo di previsione prende il nome di multivariate time series. Un altro
cambiamento che vogliamo apportare è la possibilità di lavorare meglio
in previsioni a lungo termine sfruttando previsioni multi-step che possano
predire un range temporale senza la creazione di più modelli separati. Le
neural network sono in grado di soddisfare le nostre necessità.
Una delle migliori sfide del machine learning è far sì che il modello parli da
solo. Non è importante solamente sviluppare una soluzione accurata, con
un grande potere previsionale, ma anche sapere come il modello fornisce
questi risultati: quali variabili sono maggiormente coinvolte, la presenza
74
4.3 – LSTM
75
Previsione serie temporale tramite machine learning
Prima di passare alle creazione del modello vero e proprio, diamo uno
sguardo all’allacciamento ai topic popolati da Flink. Il codice in figura
4.13 mostra i vari moduli che servono e l’inizializzazione delle variabili che
saranno usate nel caso simple. Nella parte finale è realizzato il connettore
a Kafka, con una politica "earliest" per accedere a tutto lo storico già
cumulato dal framework. Dato che l’ordinamento non è garantito bisogna
avere l’intero storico, la variabile "allDataStored" indica proprio se i dati
già stoccati sono stati esauriti, e fintanto rimane falsa si aspetta di riceverli
tutti. Lo sblocco avviene quando tra un dato e l’altro passano almeno
50 minuti, con questa condizione si assicura di star ricevendo in tempo
reale e quindi con cadenza oraria, per il caso simple. Una volta ricevuti e
trasformati in data frame si ordinano per timestamp. Da qui i dati ricevuti
in tempo reale sono logicamente ordinati, nel caso Kafka si stoppasse e
al riavvio venisse rifornito di tutti i dati del periodo in cui è rimasto
inattivo, questi sarebbero disordinati, quindi ogni volta che un dato non
mi arriva a distanza di un ora bisogna rifare l’ordinamento (figura 4.14).
Nella stessa figura è anche mostrato il codice per assegnare la risposta
y ad ogni dato di training, ovvero ciò che si vuole prevedere. Questa è
l’unica parte che Flink non ha potuto svolgere, in quanto il vettore di
720 elementi (1 giorno) corrisponde a dati che non sono ancora arrivati,
quindi si genererebbero dati ritardati ma noi vogliamo avere il valore più
aggiornato per effettuare la previsione, perciò le y sono calcolate in un
secondo momento. Nel calcolo si è fatto attenzione nel non avere buchi,
e le informazioni incomplete sono state eliminate. Una volta posseduti
un numero minimo di dati viene allenato il modello, quest’operazione è
la più pesante computazionalmente e viene effettuata in pochi momenti
molto distanziati (anche più di quanto riportato nel codice). Con questo
modello ad ogni nuovo dato è possibile stimare l’andamento.
4.3.2 Il modello
Per prima cosa è necessaria una fase di normalizzazione che aiuterà il mo-
dello a raggiungere la convergenza e ne velocizzerà l’apprendimento. An-
che i valori predetti sono normalizzati: il Bitcoin ha una grande varianza
e tocca valori anche intorno ai 10000€ nel periodo monitorato, questo può
causare valori anomali in caso di previsioni errate che con una normaliz-
zazione sono mitigate. La normalizzazione non è calcolata considerando
l’intero storico, ma considerando batch di due giorni. In questo modo ogni
dato sarà normalizzato per conto suo e sarà così calibrato solamente sugli
ultimi valori senza subire influenze dal passato. I dati a nostra disposizio-
ne coprono un mese e mezzo di osservazioni tra il luglio e l’agosto 2020,
l’ultimo tratto di questo periodo è usato come test del modello ed è abba-
stanza adeguato a mostrare le debolezze nel predire una caduta del prezzo,
mostrando un oscillazione che da 10000€ scende sotto i 9500€ nell’arco di
poche ore. Partiamo da un modello semplice, un vanilla LSTM, composto
da un singolo hidden layer, usiamo tanh come funzione di attivazione di
questo layer e come strato finale ci deve essere un fully connected layer
con un numero di unità pari al numero di elementi di output, quindi 720.
Tra le funzioni di ottimizzazione scegliamo adam che ha una curva di ap-
prendimento più lenta, e permette di raggiungere la convergenza con più
sicurezza. Il risultato dopo 20 epoche è mostrato in figura 4.16, si nota-
no delle predizioni abbastanza realistiche per il modello, che non sempre
riescono ad intuire il corretto trand del Bitcoin. Per valutare l’accura-
tezza del modello non possiamo usare i metodi tradizionali che ci danno
una percentuale di quanto è preciso perché non siamo in un problema di
classificazione. Per le serie temporali possiamo usare l’RMSE (Root Mean
Squared Error)
ö
õ qn
ô i=1 (xi
õ − x̂i )2
RM SE =
n
ci indica con una misura della stessa grandezza del valore interessato, di
quanto la previsione si scosta dal valore reale. Nella figura 4.17 sono mo-
strati due grafici raffiguranti l’RMSE. Quello a destra indica l’errore per
ogni singola predizione, ricordiamo che nel caso "simple" una predizione
corrisponde a 720 valori, a cui è stato calcolato l’RMSE, i valori oscillano
intorno ai 50/70 quando il modello si comporta bene, ma in corrisponden-
za di grandi oscillazioni la discrepanza tra predizione e realtà si fa sentire.
77
Previsione serie temporale tramite machine learning
78
4.3 – LSTM
80
4.3 – LSTM
83
Previsione serie temporale tramite machine learning
85
Previsione serie temporale tramite machine learning
86
4.3 – LSTM
Figura 4.20: Accuratezza modello a più strati. A sinistra l’RMSE per pro-
fondità di previsione, a destra il valore dell’RMSE step by step. Caso
simple.
87
Previsione serie temporale tramite machine learning
88
4.3 – LSTM
89
90
Capitolo 5
Conclusioni
Le applicazioni di continuous intelligence sono infinite, e il loro utilizzo sta
continuando a riempire spazio nel mercato di tutte le aziende moderne.
L’analisi in streaming è la naturale svolta delle applicazioni Big Data che
hanno una disponibilità di dati continui nel tempo, e l’automazione anche
solo parziale delle strategie di business, permette soluzioni tempestive e
affidabili al verificarsi di determinate condizioni, ottimizzando i processi
di produzione ed incrementando i profitti ottenuti.
Nella nostra applicazione ci siamo limitati a catturare informazioni in
streaming riguardanti il Bitcoin, considerando direttamente il valore di
exchange, o attraverso indici largamente utilizzati dai traders, ed anche
da informazioni ricavate da Twitter, come la quantità di persone che discu-
tono dell’argomento e il loro sentimento riguardo lo stesso. Potenzialmente
le fonti su cui plasmare i nostri dati possono essere davvero vaste, ma bi-
sogna anche saper riconoscere i dati ininfluenti. Il sentiment ad esempio si
è rivelato essere molto meno utile di quanto ci si aspettasse: il numero di
tweet sul Bitcoin è sorprendentemente alto, considerando che dall’API di
Twitter si riesce ad attingere solo ad una percentuale del totale, 70 tweet
di media ogni due minuti è un buon dato. Ognuno di questi però aveva
sentimenti molto variabili e generalmente positivi, che, effettuando una
media, non erano in grado di fornire un informazione abbastanza forte su
cui poter basare una previsione. Parlando sempre di sorgenti dei dati, in
questa tesi è stato deciso, partendo da zero, di acquisire informazioni in
streaming. In generale però si possono considerare anche gli storici, dati
stazionari presi da database da affiancare a informazioni real-time per ef-
fettuare analisi più consistenti.
91
Conclusioni
92
Bibliografia
[1] Statista, Volume of data/information created worldwide from 2010
to 2024. Disponibilità: https://www.statista.com/statistics/
871513/worldwide-data-created/
[2] Steve Swoyer, Beer and Diapers: The Impossible Correlation, TDWI.
Disponibilità: https://tdwi.org/articles/2016/11/15/beer-and-
diapers-impossible-correlation.aspx
[3] Franz H. Messerli, M.D., Chocolate Consumption, Cognitive Func-
tion, and Nobel Laureates, The new england journal of medicine.
Disponibilità: http://www.biostat.jhsph.edu/courses/bio621/
misc/Chocolate%20consumption%20cognitive%20function%20and%
20nobel%20laurates%20(NEJM).pdf
[4] ABIresearch, 54 Technology Trends To Watch In 2020. Disponibi-
lità: https://go.abiresearch.com/lp-54-technology-trends-to-
watch-in-2020?utm_source=media&utm_medium=email
[5] Douglas Laney. BControlling Data Volume, Velocity and Variety.
Disponibilità: https://blogs.gartner.com/doug-laney/files/
2012/01/ad949-3D-Data-Management-Controlling-Data-Volume-
Velocity-and-Variety.pdf
[6] Andrea De Mauro, Marco Greco, Michele Grimaldi, (2016) A formal
definition of Big Data based on its essential features, Library Review,
Vol. 65 Issue: 3, pp.122-135
[7] Jaime G. Fitzgerald, Gniewko Lubecki, Cynthia Jaggi, The Data to
Dollars (TM) Value Chain : A Practical Guide to Business Analytics
[8] Cavanillas J., Curry E., Wahlster W. (eds) New Horizons for a
Data-Driven Economy. Big Data Usage, Becker T. (2016). Dispo-
nibilità: https://link.springer.com/chapter/10.1007/978-3-319-
21569-3_8
93
Bibliografia
[9] James Serra. What is the Lambda Architecture, Big Data and Da-
ta Warehousing. Disponibilità: https://www.jamesserra.com/
archive/2016/08/what-is-the-lambda-architecture/
hadoop_summit_2015_takeaway_the_lambda_architecture-
picture_1/
[10] Soumaya Ounacer, Mohamed Amine Talhaoui, Soufiane Ard-
chir, Abderrahmane Daif, Mohamed Azouazi, A New Architecture
for Real Time Data Stream Processing. International Journal of
Advanced Computer Science and Applications, Vol. 8, No. 11,
2017. Disponibilità: https://www.researchgate.net/publication/
321494828_A_New_Architecture_for_Real_Time_Data_Stream_Processing
[11] Babak Yadranjiaghdam, Seyedfaraz Yasrobi, Nasseh Tabrizi, Develo-
ping a Real-Time Data Analytics Framework for Twitter Streaming Da-
ta. 2017 IEEE 6th International Congress on Big Data. Disponibilità:
https://ieeexplore.ieee.org/document/8029342
[12] Paula Ta-Shma, Adnan Akbar, Guy Gerson-Golan, Guy Hadash,
Francois Carrez, and Klaus Moessner, An Ingestion and Analy-
tics Architecture for IoT Applied to Smart City Use Cases, IEEE
Internet of Things Journal Vol:5 2018. Disponibilità: https://
ieeexplore.ieee.org/abstract/document/7964673
[13] Subhashini Chellappan, Dharanitharan Ganesan, Spark Real-Time
Use Case, Practical Apache Spark pp 261-273. Disponibilità: https:
//link.springer.com/chapter/10.1007/978-1-4842-3652-9_10
[14] Pat Research Top 18 data ingestion tools. Disponibilità: https://
www.predictiveanalyticstoday.com/data-ingestion-tools/
[15] NSA Releases First in Series of Software Products to Open Source
Community. Disponibilità: www.nsa.gov
[16] Apache NiFi Overview. Disponibilità: https://nifi.apache.org/
docs/nifi-docs/html/overview.html
[17] CLOUDERA DOCS. Multi-Tenant Authorization. Disponibili-
tà: https://docs.cloudera.com/HDPDocuments/HDF3/HDF-3.0.1.1/
bk_administration/content/multi-tenant-authorization.html
[18] Eran Levy, Kafka vs. RabbitMQ: Architecture, Performance Use Ca-
ses. Disponibilità: https://www.upsolver.com/blog/kafka-versus-
rabbitmq-architecture-performance-use-case
[19] Neha Narkhede, Gwen Shapira, Todd Palino, Kafka: The Defini-
tive Guide. Disponibilità: https://www.oreilly.com/library/view/
94
Bibliografia
kafka-the-definitive/9781491936153/ch04.html
[20] Farhad Mehdipour, Hamid Noori, Bahman Javadi, Advances in Com-
puters, Chapter Two - Energy-Efficient Big Data Analytics in Da-
tacenters. Disponibilità: https://www.sciencedirect.com/topics/
computer-science/big-data-processing
[21] Farhad Mehdipour, Hamid Noori, Bahman Javadi, Spark Streaming,
Chapter Two - Energy-Efficient Big Data Analytics in Datacenters.
Disponibilità: https://databricks.com/glossary/what-is-spark-
streaming
[22] Alfonso Puttini, Cassandra vs MongoDB. Disponibilità:
https://www.alfonsoputtini.it/programmazione/nosql/
cassandra-vs-mongodb/
[23] Nishant Garg, Apache Kafka, Packt Publishing, 2013.
[24] Alpha Vantage. Disponibilità: https://www.alphavantage.co/
[25] Wikipedia, Web scraping Disponibilità: https://it.wikipedia.org/
wiki/Web_scraping
[26] Alpha Vantage Support, API Key Disponibilità: https://
www.alphavantage.co/support/#api-key
[27] Twitter, Docs. Disponibilità: https://developer.twitter.com/en/
docs
[28] InternetLiveStats, Twitter Usage Statistics. Disponibilità: https://
www.internetlivestats.com/twitter-statistics/
[29] Georg Dorffner, Neural Networks for Time Series Processing. Dept.
of Medical Cybernetics and Artifcial Intelligence, University of Vien-
na and Austrian Research Institute for Artifcial Intel ligence. Di-
sponibilità: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=
10.1.1.45.5697
[30] John Cristian, Borges Gamboa, Deep Learning for Time-Series
Analysis. University of Kaiserslautern Kaiserslautern, Germany.
Disponibilità: https://arxiv.org/abs/1701.01887
[31] Twitter developer, Potential adjustments to Streaming API sam-
ple volumes. Disponibilità: https://twittercommunity.com/t/
potential-adjustments-to-streaming-api-sample-volumes/
31628
[32] Massimo Amato, Luca Fantacci, Per un pugno di bitcoin: Rischi e
opportunità delle monete virtuali.
95
Bibliografia
96