SlideShare a Scribd company logo
1 of 75
OrientDB & Big Data:
storie di vita vissuta
Da un caso di successo
a un futuro che “spacca”
BigData & Graphs in Rome
Luca Bianconi
Senior Consultant
Partner Italiano
di Orient Technologies UK
2
Un po’ di storia
• Nata nel 2004 come technological company di
AssetManagement, AssetData si impone sin da subito
come leader in Italia per lo sviluppo e l’integrazione delle
tecnologie open source più innovative ed evolute:
– Java
– Roma<Meta>Framework
– AngularJS
– OrientDB
• Ha partecipato a diversi progetti per lo sviluppo e la
diffusione di software open source con il supporto della
Comunità Europea
• Leader nello sviluppo di soluzioni HR
• Acquisita nel 2012 da leader nel settore della
somministrazione di lavoro (fatturato internazionale >> €
800M)
3
La nuova direzione
Trick
StressCorrelato
SKY
Apprendistato
4
La richiesta
Sviluppare un sistema di BI (real time)
per le VLT di una famosa società italiana
di gaming
5
Cosa sono le VLT
Video Lottery Terminal
6
Il mondo delle VLT
• Fornitori: Gtech, Novomatic, etc.
• Concessionari: Lottomatica, SNAI, SISAL,
etc.
• Macchine: VLT, AWP, etc.
• Distribuzione geografica: Aree, Regioni,
Province, …, Sale
• Granularità dati: Sala, Gioco, VLT
• Frequenza dati: singola giocata o
giornaliera
7
Qualche numero
• 5.000 Sale
• 40.000 VLT
• 30 Giochi
• 10 Concessionari
• 9 Flussi di dati a concessionario
• > 60.000.000 di record al giorno per le
concessionarie più grandi
8
Cosa abbiamo trovato
• DB2
• 4 ore per l’estrazione dei file di un singolo
concessionario (size = 2.5GB)
• Excel e Access
• 3 persone full x analizzare i dati
• Centinaia di mail a settimana per il board
• Dati destrutturati…
9
Esigenze
• BIG DATA
– MILIARDI DI RECORD
• PERFORMANCE
– TEMPI DI RISPOSTA IMMEDIATI
• WEB BASED
– RAGGIUNGIBILE DA INTRANET/INTERNET
• GESTIONE UTENTI
– PROFILAZIONE RUOLI
• REPORT, GRAFICI E DATI MODIFICABILI
– ALTA INTERATTIVITA’
10
L’implementazione
Serve un multi-model graph database!
11
C’è tanto da fare
Ok abbiamo il DB: Orient 1.3. E adesso?
12
Da Orient a OrientBI
CSV ETL (Java)
OrientDB
Istruzioni in JS
Front end e Back end
Html + JS + Bootstrap
Command + JS
Report
Orient Processing LAnguage
JSON
JSON
JS (orientdb-bi)
13
Architettura finale
PLATFORM 1
…
PLATFORM 2
PLATFORM 4
OrientBI
GRAFICI
REPORT
SCHEDE
MODIFICABILI
PLATFORM 3
14
La lista della spesa
•ETL
•Back end
•Front end
•Report
•Applicazione
15
ETL parte 1
• I file si trovano all’interno di una cartella denominata
‘’template’’
• I file hanno estensione: *.template
• Nel file orientdb-server-config.xml c’è il seguente codice
relativo all’etl:
…………………………….
16
ETL parte 2
‘’HEADER’’
@class Sala
[@save disabled]
@field sistema link @join Sistema.id_sistema_aams
@field seriale_vlt string @trim
@field codice_aams string @index
@field regione skip
@field metri_quadri integer
@field data_estrazione date @format MM/dd/yyyy
@index Sala.sistema_seriale UNIQUE sistema seriale_vlt
17
ETL parte 2
‘’BODY’’
@onBeforeFile {{{
…
}}}
@onBeforeLine {{{
@onAfterFile {{{
@onAfterLine {{{
…
[record.save();]
}}}
18
ETL e linguaggi
• Rhino
• Se viene utilizzato Java 8 il motore sarà
Nashorn
– Prestazioni equiparabili a Google V8
19
ETL esempi di codice 1
@onBeforeLine {{{
var record = task.getVariable("currentRecord");
var lastDate = task.getVariable("lastDate" );
var currentDate = record.field("data_contabile");
if( lastDate == null || !lastDate.equals( currentDate ) ) {
var deleted = db.command("delete from
DatiContabiliVLTGioco where data_contabile = ? and sistema =
?", currentDate, sistema);
task.setVariable("lastDate", currentDate );
}
}}}
20
ETL esempi di codice 2
// GROUP MONTLY DATA
var dayOfTheMonth =
finalDate.get(java.util.Calendar.DAY_OF_MONTH);
var firstOfMonth =
Packages.com.orientechnologies.orient.core.util.
ODateHelper.getDatabaseCalendar();
…
groupDatiSala(firstOfMonth.getTime(), maxDate,
"DatiContabiliSala_mese", sistema);
21
1° POC
• >> 1000 rec/sec
• Ok ‘’It works!’’
• Come vedo se ha importato i dati?
• La console è scomoda… usa Studio!
22
Il primo Studio
23
Il secondo Studio
24
Boe dammi una Duff!
25
E’ sufficiente?
• 120.000.000 (record) ÷ 1.200
(record/secondo)
• + o - fanno 28 ore…
• E il real time?
Darvaza
Turkmenistan
Porta dell’inferno
26
La soluzione
Dove non arriva JS arriva Java
Modifica dell’header del template e
implementazione dell’import in Java
@class GiocateOrarie
@implementation
it.assetdata.customer.bi.listener.GiocateOrarieImp
orterListener
27
Pericolo scampato
• Risultato = 25.000 r/s (1h e ½ per l’import)
28
Front end
• I dati ci sono
• Visualizziamoli
29
Come è strutturata una pagina
Menu di selezione sale
Menu di selezione temporale
Pulsanti di esecuzione, schedulazione, etc.
[Sezione relativa ai grafici]
Creazione variabili
Invio contestualizzato variabili
Funzioni specifiche
Menu
Risultati
Codice
30
Un report tipo
function renderProvince() {
var concessionarie = $("#concessionarie").val();
var aree = $("#aree").val();
var regioni = $("#regioni").val();
var optionsProvince = "<option value='undefined'></option>";
queryResult = db.executeFunction('province',
[ concessionarie, regioni, aree ]);
for ( var r in queryResult.result) {
optionsProvince += '<option value="' + queryResult.result[r].provincia
+ '">' + queryResult.result[r].provincia + '</option>';
}
$('#province').html(optionsProvince);
renderCitta();
}
31
Le OFunction
32
Come viene generato un report
queryResult = db.process('conc8', [ year, month, week, day,
conc, regioni, pv, citta, sale, aree ], function(result) {
$('#content').html(processResult(result.result[0],
{}));
}, function() {
showErrorMessage(orientServer.getErrorMessage());
});
33
Orient Processing LAnguage: OPLA
• Cosè OPLA?
• Creato nel 2012 per essere integrato in
Orient
• E’ un JSON
• E’ un linguaggio di interrogazione del server
in maniera strutturata
• Potente, semplice e leggero
34
Alcuni elementi di OPLA 1
• Comprende 8 tipi di blocchi:
– Execute
– Let
– Output
– Table
– Function
– Query
– Script
– Iterate
35
Alcuni elementi di OPLA 2
• Inizio tipico
{
"type" : "execute",
"do" : [{
…
36
Struttura di report
Ricezione delle variabili
Assegnazione del nome dei campi
[Customizzazione del nome dei campi]
Let
Output Header
Body
Execute Do Function Esecuzione OFunction
Query Esecuzione query
Function Formattazione campi
Script Esecuzione IstruzioniEnd
Output Esecuzione OFunctionFooter
37
Acquisizione variabili
{
"type" : "execute",
"do" : [{
"type" : "let",
"value" : {
"debugMode" : "false",
"da" : "${arg0}",
"a" : "${arg1}",
"range" : "${arg2}"
38
Esecuzione OFunction
{
"type" : "function",
"function" : "getClassName",
"args" : [
"DatiContabiliSala",
null,
"${range}"
],
"return" : "className"
}
39
Esecuzione query
{
"type":"query",
"target":"${className}",
"fields":[
"data_contabile",
"' ' as cipupd",
"count( distinct( vlt ) ) as macchine_giocanti"
],
"groupBy":"data_contabile",
"filter":" data_contabile between ${da} and ${a}
${filterByZone}",
"return":"macchineGiocanti"
}
40
Altre applicazioni di let
{
"type" : "let",
"if" : "${typologyReportResult[2]} > 0 ",
"target" : "${current}",
"value" : {
"cipupd" : "={ if( ( ${typologyReportResult[1]}
<> 0 ), eval(' ${current.cash_in} /
${typologyReportResult[0]}'), '' ) }"
}
}
41
OPLA e altri linguaggi
],
"end" : {
"type":"script",
"language":"Javascript",
"code":"
var actualPeriod = ctx.getVariable('$root.$actualPeriod');
if( actualPeriod != null && !actualPeriod.equals('undefined') ){
var block = ctx.getVariable('$root.$block');
var result = block.getParentBlock().getReturnValue();
if( result.size() > 0 ){
42
Un ultimo passaggio
• Il JSON viene processato dalla funzione
processResult della libreria orientdb-bi
• Verranno formattati header, body e footer
orientdb-bi
43
Il risultato
44
App: Archivio Commerciale
• Esigenza: informatizzare le visite delle sale
• Soluzione: OrientBI
– Command
– JS
– JQueryUI
Scheda Sala
Upload/Download file e foto
Aggiornamento DB
45
Come si presenta
46
Qualche dettaglio
47
Come si salvano i dati
rootObject = {
"@type" : "d",
"@class" : "VisiteSala",
"sala" : ridSala,
"data" : dataUTC,
"esercente" : esercente,
...
"vlt_piattaforma" : vlt_piattaforma
};
rootObject = db.save(rootObject);
if (db.getErrorMessage() == null) {
visitaList(ridSala);
} else
alert(db.getErrorMessage());
48
Alcuni dati salvati
EmbeddedMap
Collection
49
E le storie di vita vissuta?
• Local
• Indici
• Backup
• OPLA & Debug
• SNAPSHOT
• Aggregazioni
50
Robustezza(…) e velocità
Orient 1.4 = Local + MVRB-Tree
51
Quali inconvenienti?
• Riavvio improvviso della macchina:
– Ricostruzione degli indici
– Possibili record corrotti (tipicamente si
danneggia la tabella di allocazione dei record
sul disco risultando enormi >> 1GB)
• Riavvio normale del server Orient:
– Possibile flush non completo su disco
(prevalentamente con il kill del processo)
• Possibili record danneggiati
• Possibili indici inaffidabili
• In sostanza i normali problemi del Memory
Mapping!
52
Come correggere i danni?
Come si ricostruisce una città dopo il passaggio di Godzilla?
Solo avendo una città di backup!
53
Ripristino dei dati
• Il backup è affidabile?
– Se il db è integro si
– E’ lento (di fatto è un processo di export e
import)
– E’ estremamente lento in caso di record
corrotti
54
OPLA & Debug
• NON esiste
• Si passa per i breakpoint su IDE…
• C’è un poc realizzato da @ldellaquila di una
versione OrientBI 2.0 dove è possibile
impostare i breakpoint sui blocchi OPLA da
IDE web
55
Quando sarà rilasciato?
• Solo lui ci può rispondere…
56
Dalla 1.4 alla 1.7
• Local vs Plocal
• Wal
• MVRB-Tree vs SBTree, Hash & Lucene
• Backup migliorato
• Clustering multimaster
• Sharding
• Lucene
• …
• Più funzionalità
• Più stabilità
57
Come è andata?
58
Tutto ok?
• Gli indici non sono ancora dentro il WAL
• Con grandi db la ricostruzione è lenta (anche 11
ore!)
• Nel caso di indici compositi se nella query non
è presente la prima property non avremo
nessun risultato (usare più indici)
• Parser sql…
• Ottimizzatore query non sempre ottimizza…
• Complessa la parte di debug (explain, yourkit*,
etc…)
• Serializzazione…
59
RoadMap 2.0
60
• Protocollo binario (3x – 20x)
• Indici nel WAL
• Improvement Multicore
• Visualizzazione dei grafi su Studio
• Altro…
Per il futuro?
61
Lavorare con le SNAPSHOT
• Perché?
– Per avere sempre l’ultima versione
– Per avere subito delle modifiche ad hoc utilizzando solo
GIT
• Perché no? (tutto quello che è successo e nessuno lo ha mai detto…)
– Perché all’improvviso chiunque potrebbe inserire una
feature che non permette più di aprire il db
– Perché all’improvviso si potrebbe rendere necessario
esportare e importare tutto
– Perché all’improvviso alcune convenzioni potrebbero
cambiare in maniera sostanziale
– Perché all’improvviso i nuovi indici potrebbero non
essere più affidabili
– Perché i sistemi di debug potrebbero non funzionare*
– Perché non si dovrebbe fare e basta!
62
Sinergie
• Lavorare con le SNAPSHOT permette una
scoperta e una soluzione dei bug molto
rapida (con il team di Orient)
• Gli indici sono migliorati in maniera
importante (la ricostruzione è passata da 300 r/s
a 20.000 r/s senza più heap dump)
• Sono state aggiunte molte nuove
funzionalità
63
Le aggregazioni
• Nuova richiesta: velocizzare il report più usato
• Visualizza tutti i giorni, settimane, mese e anni
presenti sul db (a seconda della scelta)
• Raggruppa ogni volta real time
• Esegue e unisce i risultati delle query eseguite
su 2 classi: da 2.000.000 e da 8.000.000 di
record
• I raggruppamenti settimanali e mensili sono i
più usati
64
BI = Aggregazioni
• Una soluzione è creare altre classi che
gestiscono i dati aggregati.
• Vantaggi:
– Facile implementazione (OFunction in fase
di import)
– Pochi dati da gestire
• Svantaggi:
– Problemi di coerenza da una classe
all’altra
– Moltiplicazione degli indici
65
Dov’è la parte graph?
• Nei flussi che contengono tutte le
transazioni è stato seguito un approcio
diverso: legare le date ad un grafo
temporale
Anno
Mese
Settimana
Giorno Ora
Minuti
Secondi
Record
Record
Record
66
Meglio degli indici?
• Gli indici sono un albero bilanciato (che è
un tipo di grafo), quindi sono quasi
equivalenti
• Performance sulle aggregazioni non
accettabili (su classi da centinaia di milioni di
dati)
• Perché è stato sviluppato?
• Per sopperire agli indici allora immaturi
67
Come ottimizzare le ricerche
Anno
Mese
Settimana
Giorno Ora
Minuti
Secondi
RecordRecord
Record
Aggr AggrAggrAggr
Aggr
AggrAggr
n x 12
n
Aggr
68
Quante dimensioni?
• Tipicamente temporale o temporale x
territoriale
• Limite = n
69
Tutto rose e fiori?
• Punti di attenzione:
– Dimensioni del db
– Transazionalità delle aggregazioni per
evitare inconsistenza da un livello più
basso ad uno più alto
– E’ più efficiente del connubio indici x
classi?
Probabilmente no!
70
Quando è più indicato il graph?
• Utilizzare il grafo quando il costo di
aggregazione è maggiore di quello di ricerca
out().in()
71
Continueremo ad usare Orient?
• Si perché:
– In molti casi offre notevoli vantaggi
rispetto ad un relazionale e rispetto alla
concorrenza
– Perché la 1.7 è un prodotto maturo e la
2.0 sarà ancora più performante
– Perché se il cliente cambia i requisiti
dopo 18 mesi in produzione con poco
effort si può cambiare un’applicazione 
72
Feedback
Insomma parafrasando Edward Norton
‘’Orient spacca!’’
73
Grazie
luca.bianconi@assetdata.it
#AssetCercaCollaboratori
jobs@assetdata.it
75

More Related Content

Similar to OrientDB & Big Data

2014.11.14 Implementare e mantenere un progetto Azure SQL Database
2014.11.14 Implementare e mantenere un progetto Azure SQL Database2014.11.14 Implementare e mantenere un progetto Azure SQL Database
2014.11.14 Implementare e mantenere un progetto Azure SQL DatabaseEmanuele Zanchettin
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBSteve Maraspin
 
2014.11.14 Implementare e mantenere un progetto Azure SQL Database
2014.11.14 Implementare e mantenere un progetto Azure SQL Database2014.11.14 Implementare e mantenere un progetto Azure SQL Database
2014.11.14 Implementare e mantenere un progetto Azure SQL DatabaseEmanuele Zanchettin
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query ProcessingGianluca Hotz
 
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...Dominopoint - Italian Lotus User Group
 
CCI2018 - Exchange 2019 (novità e setup)
CCI2018 - Exchange 2019 (novità e setup)CCI2018 - Exchange 2019 (novità e setup)
CCI2018 - Exchange 2019 (novità e setup)walk2talk srl
 
Dynamic Language Programming For The Statically Typed Programmer
Dynamic Language Programming For The Statically Typed ProgrammerDynamic Language Programming For The Statically Typed Programmer
Dynamic Language Programming For The Statically Typed ProgrammerMarco Parenzan
 
MySQL Tech Tour 2015 - Progettare, installare e configurare MySQL Cluster
MySQL Tech Tour 2015 - Progettare, installare e configurare MySQL ClusterMySQL Tech Tour 2015 - Progettare, installare e configurare MySQL Cluster
MySQL Tech Tour 2015 - Progettare, installare e configurare MySQL ClusterPar-Tec S.p.A.
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query ProcessingGianluca Hotz
 
Come l’Open Source può essere alla base di un business di successo: il caso H...
Come l’Open Source può essere alla base di un business di successo: il caso H...Come l’Open Source può essere alla base di un business di successo: il caso H...
Come l’Open Source può essere alla base di un business di successo: il caso H...MariaDB plc
 
ETL on Cloud: Azure Data Factory
ETL on Cloud: Azure Data FactoryETL on Cloud: Azure Data Factory
ETL on Cloud: Azure Data FactoryLeonardo Marcucci
 
Implementare e mantenere un progetto azure sql database v.2
Implementare e mantenere un progetto azure sql database v.2Implementare e mantenere un progetto azure sql database v.2
Implementare e mantenere un progetto azure sql database v.2Emanuele Zanchettin
 
iot Saturday 2019 - PoC iot in 1 ora
iot Saturday 2019 - PoC iot in 1 oraiot Saturday 2019 - PoC iot in 1 ora
iot Saturday 2019 - PoC iot in 1 oraAlessio Biasiutti
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSAndrea Saltarello
 
SQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with SparkSQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with SparkAlessio Biasiutti
 
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Codemotion
 
Design Patterns - Enterprise Patterns (part 2)
Design Patterns - Enterprise Patterns (part 2)Design Patterns - Enterprise Patterns (part 2)
Design Patterns - Enterprise Patterns (part 2)Fabio Armani
 

Similar to OrientDB & Big Data (20)

2014.11.14 Implementare e mantenere un progetto Azure SQL Database
2014.11.14 Implementare e mantenere un progetto Azure SQL Database2014.11.14 Implementare e mantenere un progetto Azure SQL Database
2014.11.14 Implementare e mantenere un progetto Azure SQL Database
 
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDBPolyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
Polyglot Persistance con PostgreSQL, CouchDB, MongoDB, Redis e OrientDB
 
2014.11.14 Implementare e mantenere un progetto Azure SQL Database
2014.11.14 Implementare e mantenere un progetto Azure SQL Database2014.11.14 Implementare e mantenere un progetto Azure SQL Database
2014.11.14 Implementare e mantenere un progetto Azure SQL Database
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query Processing
 
#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)#dd12 Applicazioni a tre voci (Android e Domino)
#dd12 Applicazioni a tre voci (Android e Domino)
 
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
Dati, dati, dati! - Sfruttare le potenzialità delle XPages con Google Chart T...
 
CCI2018 - Exchange 2019 (novità e setup)
CCI2018 - Exchange 2019 (novità e setup)CCI2018 - Exchange 2019 (novità e setup)
CCI2018 - Exchange 2019 (novità e setup)
 
Dynamic Language Programming For The Statically Typed Programmer
Dynamic Language Programming For The Statically Typed ProgrammerDynamic Language Programming For The Statically Typed Programmer
Dynamic Language Programming For The Statically Typed Programmer
 
MySQL Tech Tour 2015 - Progettare, installare e configurare MySQL Cluster
MySQL Tech Tour 2015 - Progettare, installare e configurare MySQL ClusterMySQL Tech Tour 2015 - Progettare, installare e configurare MySQL Cluster
MySQL Tech Tour 2015 - Progettare, installare e configurare MySQL Cluster
 
SQL Server Modern Query Processing
SQL Server Modern Query ProcessingSQL Server Modern Query Processing
SQL Server Modern Query Processing
 
Mobile e Smart Client
Mobile e Smart ClientMobile e Smart Client
Mobile e Smart Client
 
Come l’Open Source può essere alla base di un business di successo: il caso H...
Come l’Open Source può essere alla base di un business di successo: il caso H...Come l’Open Source può essere alla base di un business di successo: il caso H...
Come l’Open Source può essere alla base di un business di successo: il caso H...
 
ETL on Cloud: Azure Data Factory
ETL on Cloud: Azure Data FactoryETL on Cloud: Azure Data Factory
ETL on Cloud: Azure Data Factory
 
Implementare e mantenere un progetto azure sql database v.2
Implementare e mantenere un progetto azure sql database v.2Implementare e mantenere un progetto azure sql database v.2
Implementare e mantenere un progetto azure sql database v.2
 
iot Saturday 2019 - PoC iot in 1 ora
iot Saturday 2019 - PoC iot in 1 oraiot Saturday 2019 - PoC iot in 1 ora
iot Saturday 2019 - PoC iot in 1 ora
 
PoC IoT in 1 ora
PoC IoT in 1 oraPoC IoT in 1 ora
PoC IoT in 1 ora
 
Layered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRSLayered Expression Trees feat. CQRS
Layered Expression Trees feat. CQRS
 
SQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with SparkSQL Saturday 2019 - Event Processing with Spark
SQL Saturday 2019 - Event Processing with Spark
 
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
Marco Arena - Perché nel 2015 parliamo ancora di C++? | Codemotion Milan 2015
 
Design Patterns - Enterprise Patterns (part 2)
Design Patterns - Enterprise Patterns (part 2)Design Patterns - Enterprise Patterns (part 2)
Design Patterns - Enterprise Patterns (part 2)
 

Recently uploaded

Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 

Recently uploaded (9)

Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 

OrientDB & Big Data

  • 1. OrientDB & Big Data: storie di vita vissuta Da un caso di successo a un futuro che “spacca” BigData & Graphs in Rome
  • 2. Luca Bianconi Senior Consultant Partner Italiano di Orient Technologies UK 2
  • 3. Un po’ di storia • Nata nel 2004 come technological company di AssetManagement, AssetData si impone sin da subito come leader in Italia per lo sviluppo e l’integrazione delle tecnologie open source più innovative ed evolute: – Java – Roma<Meta>Framework – AngularJS – OrientDB • Ha partecipato a diversi progetti per lo sviluppo e la diffusione di software open source con il supporto della Comunità Europea • Leader nello sviluppo di soluzioni HR • Acquisita nel 2012 da leader nel settore della somministrazione di lavoro (fatturato internazionale >> € 800M) 3
  • 5. La richiesta Sviluppare un sistema di BI (real time) per le VLT di una famosa società italiana di gaming 5
  • 6. Cosa sono le VLT Video Lottery Terminal 6
  • 7. Il mondo delle VLT • Fornitori: Gtech, Novomatic, etc. • Concessionari: Lottomatica, SNAI, SISAL, etc. • Macchine: VLT, AWP, etc. • Distribuzione geografica: Aree, Regioni, Province, …, Sale • Granularità dati: Sala, Gioco, VLT • Frequenza dati: singola giocata o giornaliera 7
  • 8. Qualche numero • 5.000 Sale • 40.000 VLT • 30 Giochi • 10 Concessionari • 9 Flussi di dati a concessionario • > 60.000.000 di record al giorno per le concessionarie più grandi 8
  • 9. Cosa abbiamo trovato • DB2 • 4 ore per l’estrazione dei file di un singolo concessionario (size = 2.5GB) • Excel e Access • 3 persone full x analizzare i dati • Centinaia di mail a settimana per il board • Dati destrutturati… 9
  • 10. Esigenze • BIG DATA – MILIARDI DI RECORD • PERFORMANCE – TEMPI DI RISPOSTA IMMEDIATI • WEB BASED – RAGGIUNGIBILE DA INTRANET/INTERNET • GESTIONE UTENTI – PROFILAZIONE RUOLI • REPORT, GRAFICI E DATI MODIFICABILI – ALTA INTERATTIVITA’ 10
  • 12. C’è tanto da fare Ok abbiamo il DB: Orient 1.3. E adesso? 12
  • 13. Da Orient a OrientBI CSV ETL (Java) OrientDB Istruzioni in JS Front end e Back end Html + JS + Bootstrap Command + JS Report Orient Processing LAnguage JSON JSON JS (orientdb-bi) 13
  • 14. Architettura finale PLATFORM 1 … PLATFORM 2 PLATFORM 4 OrientBI GRAFICI REPORT SCHEDE MODIFICABILI PLATFORM 3 14
  • 15. La lista della spesa •ETL •Back end •Front end •Report •Applicazione 15
  • 16. ETL parte 1 • I file si trovano all’interno di una cartella denominata ‘’template’’ • I file hanno estensione: *.template • Nel file orientdb-server-config.xml c’è il seguente codice relativo all’etl: ……………………………. 16
  • 17. ETL parte 2 ‘’HEADER’’ @class Sala [@save disabled] @field sistema link @join Sistema.id_sistema_aams @field seriale_vlt string @trim @field codice_aams string @index @field regione skip @field metri_quadri integer @field data_estrazione date @format MM/dd/yyyy @index Sala.sistema_seriale UNIQUE sistema seriale_vlt 17
  • 18. ETL parte 2 ‘’BODY’’ @onBeforeFile {{{ … }}} @onBeforeLine {{{ @onAfterFile {{{ @onAfterLine {{{ … [record.save();] }}} 18
  • 19. ETL e linguaggi • Rhino • Se viene utilizzato Java 8 il motore sarà Nashorn – Prestazioni equiparabili a Google V8 19
  • 20. ETL esempi di codice 1 @onBeforeLine {{{ var record = task.getVariable("currentRecord"); var lastDate = task.getVariable("lastDate" ); var currentDate = record.field("data_contabile"); if( lastDate == null || !lastDate.equals( currentDate ) ) { var deleted = db.command("delete from DatiContabiliVLTGioco where data_contabile = ? and sistema = ?", currentDate, sistema); task.setVariable("lastDate", currentDate ); } }}} 20
  • 21. ETL esempi di codice 2 // GROUP MONTLY DATA var dayOfTheMonth = finalDate.get(java.util.Calendar.DAY_OF_MONTH); var firstOfMonth = Packages.com.orientechnologies.orient.core.util. ODateHelper.getDatabaseCalendar(); … groupDatiSala(firstOfMonth.getTime(), maxDate, "DatiContabiliSala_mese", sistema); 21
  • 22. 1° POC • >> 1000 rec/sec • Ok ‘’It works!’’ • Come vedo se ha importato i dati? • La console è scomoda… usa Studio! 22
  • 25. Boe dammi una Duff! 25
  • 26. E’ sufficiente? • 120.000.000 (record) ÷ 1.200 (record/secondo) • + o - fanno 28 ore… • E il real time? Darvaza Turkmenistan Porta dell’inferno 26
  • 27. La soluzione Dove non arriva JS arriva Java Modifica dell’header del template e implementazione dell’import in Java @class GiocateOrarie @implementation it.assetdata.customer.bi.listener.GiocateOrarieImp orterListener 27
  • 28. Pericolo scampato • Risultato = 25.000 r/s (1h e ½ per l’import) 28
  • 29. Front end • I dati ci sono • Visualizziamoli 29
  • 30. Come è strutturata una pagina Menu di selezione sale Menu di selezione temporale Pulsanti di esecuzione, schedulazione, etc. [Sezione relativa ai grafici] Creazione variabili Invio contestualizzato variabili Funzioni specifiche Menu Risultati Codice 30
  • 31. Un report tipo function renderProvince() { var concessionarie = $("#concessionarie").val(); var aree = $("#aree").val(); var regioni = $("#regioni").val(); var optionsProvince = "<option value='undefined'></option>"; queryResult = db.executeFunction('province', [ concessionarie, regioni, aree ]); for ( var r in queryResult.result) { optionsProvince += '<option value="' + queryResult.result[r].provincia + '">' + queryResult.result[r].provincia + '</option>'; } $('#province').html(optionsProvince); renderCitta(); } 31
  • 33. Come viene generato un report queryResult = db.process('conc8', [ year, month, week, day, conc, regioni, pv, citta, sale, aree ], function(result) { $('#content').html(processResult(result.result[0], {})); }, function() { showErrorMessage(orientServer.getErrorMessage()); }); 33
  • 34. Orient Processing LAnguage: OPLA • Cosè OPLA? • Creato nel 2012 per essere integrato in Orient • E’ un JSON • E’ un linguaggio di interrogazione del server in maniera strutturata • Potente, semplice e leggero 34
  • 35. Alcuni elementi di OPLA 1 • Comprende 8 tipi di blocchi: – Execute – Let – Output – Table – Function – Query – Script – Iterate 35
  • 36. Alcuni elementi di OPLA 2 • Inizio tipico { "type" : "execute", "do" : [{ … 36
  • 37. Struttura di report Ricezione delle variabili Assegnazione del nome dei campi [Customizzazione del nome dei campi] Let Output Header Body Execute Do Function Esecuzione OFunction Query Esecuzione query Function Formattazione campi Script Esecuzione IstruzioniEnd Output Esecuzione OFunctionFooter 37
  • 38. Acquisizione variabili { "type" : "execute", "do" : [{ "type" : "let", "value" : { "debugMode" : "false", "da" : "${arg0}", "a" : "${arg1}", "range" : "${arg2}" 38
  • 39. Esecuzione OFunction { "type" : "function", "function" : "getClassName", "args" : [ "DatiContabiliSala", null, "${range}" ], "return" : "className" } 39
  • 40. Esecuzione query { "type":"query", "target":"${className}", "fields":[ "data_contabile", "' ' as cipupd", "count( distinct( vlt ) ) as macchine_giocanti" ], "groupBy":"data_contabile", "filter":" data_contabile between ${da} and ${a} ${filterByZone}", "return":"macchineGiocanti" } 40
  • 41. Altre applicazioni di let { "type" : "let", "if" : "${typologyReportResult[2]} > 0 ", "target" : "${current}", "value" : { "cipupd" : "={ if( ( ${typologyReportResult[1]} <> 0 ), eval(' ${current.cash_in} / ${typologyReportResult[0]}'), '' ) }" } } 41
  • 42. OPLA e altri linguaggi ], "end" : { "type":"script", "language":"Javascript", "code":" var actualPeriod = ctx.getVariable('$root.$actualPeriod'); if( actualPeriod != null && !actualPeriod.equals('undefined') ){ var block = ctx.getVariable('$root.$block'); var result = block.getParentBlock().getReturnValue(); if( result.size() > 0 ){ 42
  • 43. Un ultimo passaggio • Il JSON viene processato dalla funzione processResult della libreria orientdb-bi • Verranno formattati header, body e footer orientdb-bi 43
  • 45. App: Archivio Commerciale • Esigenza: informatizzare le visite delle sale • Soluzione: OrientBI – Command – JS – JQueryUI Scheda Sala Upload/Download file e foto Aggiornamento DB 45
  • 48. Come si salvano i dati rootObject = { "@type" : "d", "@class" : "VisiteSala", "sala" : ridSala, "data" : dataUTC, "esercente" : esercente, ... "vlt_piattaforma" : vlt_piattaforma }; rootObject = db.save(rootObject); if (db.getErrorMessage() == null) { visitaList(ridSala); } else alert(db.getErrorMessage()); 48
  • 50. E le storie di vita vissuta? • Local • Indici • Backup • OPLA & Debug • SNAPSHOT • Aggregazioni 50
  • 51. Robustezza(…) e velocità Orient 1.4 = Local + MVRB-Tree 51
  • 52. Quali inconvenienti? • Riavvio improvviso della macchina: – Ricostruzione degli indici – Possibili record corrotti (tipicamente si danneggia la tabella di allocazione dei record sul disco risultando enormi >> 1GB) • Riavvio normale del server Orient: – Possibile flush non completo su disco (prevalentamente con il kill del processo) • Possibili record danneggiati • Possibili indici inaffidabili • In sostanza i normali problemi del Memory Mapping! 52
  • 53. Come correggere i danni? Come si ricostruisce una città dopo il passaggio di Godzilla? Solo avendo una città di backup! 53
  • 54. Ripristino dei dati • Il backup è affidabile? – Se il db è integro si – E’ lento (di fatto è un processo di export e import) – E’ estremamente lento in caso di record corrotti 54
  • 55. OPLA & Debug • NON esiste • Si passa per i breakpoint su IDE… • C’è un poc realizzato da @ldellaquila di una versione OrientBI 2.0 dove è possibile impostare i breakpoint sui blocchi OPLA da IDE web 55
  • 56. Quando sarà rilasciato? • Solo lui ci può rispondere… 56
  • 57. Dalla 1.4 alla 1.7 • Local vs Plocal • Wal • MVRB-Tree vs SBTree, Hash & Lucene • Backup migliorato • Clustering multimaster • Sharding • Lucene • … • Più funzionalità • Più stabilità 57
  • 59. Tutto ok? • Gli indici non sono ancora dentro il WAL • Con grandi db la ricostruzione è lenta (anche 11 ore!) • Nel caso di indici compositi se nella query non è presente la prima property non avremo nessun risultato (usare più indici) • Parser sql… • Ottimizzatore query non sempre ottimizza… • Complessa la parte di debug (explain, yourkit*, etc…) • Serializzazione… 59
  • 60. RoadMap 2.0 60 • Protocollo binario (3x – 20x) • Indici nel WAL • Improvement Multicore • Visualizzazione dei grafi su Studio • Altro…
  • 62. Lavorare con le SNAPSHOT • Perché? – Per avere sempre l’ultima versione – Per avere subito delle modifiche ad hoc utilizzando solo GIT • Perché no? (tutto quello che è successo e nessuno lo ha mai detto…) – Perché all’improvviso chiunque potrebbe inserire una feature che non permette più di aprire il db – Perché all’improvviso si potrebbe rendere necessario esportare e importare tutto – Perché all’improvviso alcune convenzioni potrebbero cambiare in maniera sostanziale – Perché all’improvviso i nuovi indici potrebbero non essere più affidabili – Perché i sistemi di debug potrebbero non funzionare* – Perché non si dovrebbe fare e basta! 62
  • 63. Sinergie • Lavorare con le SNAPSHOT permette una scoperta e una soluzione dei bug molto rapida (con il team di Orient) • Gli indici sono migliorati in maniera importante (la ricostruzione è passata da 300 r/s a 20.000 r/s senza più heap dump) • Sono state aggiunte molte nuove funzionalità 63
  • 64. Le aggregazioni • Nuova richiesta: velocizzare il report più usato • Visualizza tutti i giorni, settimane, mese e anni presenti sul db (a seconda della scelta) • Raggruppa ogni volta real time • Esegue e unisce i risultati delle query eseguite su 2 classi: da 2.000.000 e da 8.000.000 di record • I raggruppamenti settimanali e mensili sono i più usati 64
  • 65. BI = Aggregazioni • Una soluzione è creare altre classi che gestiscono i dati aggregati. • Vantaggi: – Facile implementazione (OFunction in fase di import) – Pochi dati da gestire • Svantaggi: – Problemi di coerenza da una classe all’altra – Moltiplicazione degli indici 65
  • 66. Dov’è la parte graph? • Nei flussi che contengono tutte le transazioni è stato seguito un approcio diverso: legare le date ad un grafo temporale Anno Mese Settimana Giorno Ora Minuti Secondi Record Record Record 66
  • 67. Meglio degli indici? • Gli indici sono un albero bilanciato (che è un tipo di grafo), quindi sono quasi equivalenti • Performance sulle aggregazioni non accettabili (su classi da centinaia di milioni di dati) • Perché è stato sviluppato? • Per sopperire agli indici allora immaturi 67
  • 68. Come ottimizzare le ricerche Anno Mese Settimana Giorno Ora Minuti Secondi RecordRecord Record Aggr AggrAggrAggr Aggr AggrAggr n x 12 n Aggr 68
  • 69. Quante dimensioni? • Tipicamente temporale o temporale x territoriale • Limite = n 69
  • 70. Tutto rose e fiori? • Punti di attenzione: – Dimensioni del db – Transazionalità delle aggregazioni per evitare inconsistenza da un livello più basso ad uno più alto – E’ più efficiente del connubio indici x classi? Probabilmente no! 70
  • 71. Quando è più indicato il graph? • Utilizzare il grafo quando il costo di aggregazione è maggiore di quello di ricerca out().in() 71
  • 72. Continueremo ad usare Orient? • Si perché: – In molti casi offre notevoli vantaggi rispetto ad un relazionale e rispetto alla concorrenza – Perché la 1.7 è un prodotto maturo e la 2.0 sarà ancora più performante – Perché se il cliente cambia i requisiti dopo 18 mesi in produzione con poco effort si può cambiare un’applicazione  72
  • 73. Feedback Insomma parafrasando Edward Norton ‘’Orient spacca!’’ 73