Post on 21-Nov-2014
description
OrientDB & Big Data:storie di vita vissuta
Da un caso di successoa un futuro che “spacca”
BigData & Graphs in Rome
2
Luca BianconiSenior Consultant
Partner Italianodi Orient Technologies UK
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)
4
La nuova direzione
Trick
StressCorrelato
SKY
Apprendistato
5
La richiesta
Sviluppare un sistema di BI (real time)per le VLT di una famosa società italiana
di gaming
6
Cosa sono le VLT
Video Lottery Terminal
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
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
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…
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’
11
L’implementazione
Serve un multi-model graph database!
12
C’è tanto da fare
Ok abbiamo il DB: Orient 1.3. E adesso?
13
Da Orient a OrientBI
CSV ETL (Java)
OrientDB
Istruzioni in JS
Front end e Back end
Html + JS + Bootstrap
Command + JS
ReportOrient Processing LAnguage
JSONJSON
Save $$$
Save $$$
JS (orientdb-bi)Save $$$
14
Architettura finale
PLATFORM 1
…
PLATFORM 2
PLATFORM 4
OrientBI
GRAFICI
REPORT
SCHEDEMODIFICABILI
PLATFORM 3
15
La lista della spesa
• ETL•Back end• Front end•Report•Applicazione
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:…………………………….
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
18
ETL parte 2
‘’BODY’’
@onBeforeFile {{{…}}}@onBeforeLine {{{@onAfterFile {{{@onAfterLine {{{… [record.save();]}}}
19
ETL e linguaggi
• Rhino
• Se viene utilizzato Java 8 il motore sarà Nashorn– Prestazioni equiparabili a Google V8
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 ); }}}}
SQL
21
ETL esempi di codice 2
// GROUP MONTLY DATAvar 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);
22
1° POC
• >> 1000 rec/sec
• Ok ‘’It works!’’
• Come vedo se ha importato i dati?
• La console è scomoda… usa
Studio!
23
Il primo Studio
24
Il secondo Studio
25
Boe dammi una Duff!
26
E’ sufficiente?• 120.000.000 (record) ÷ 1.200
(record/secondo)• + o - fanno 28 ore…• E il real time?
DarvazaTurkmenistanPorta dell’inferno
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.GiocateOrarieImporterListener
28
Pericolo scampato
• Risultato = 25.000 r/s (1h e ½ per l’import)
29
Front end
• I dati ci sono• Visualizziamoli
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
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();
}
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());
});
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
35
Alcuni elementi di OPLA 1
• Comprende 8 tipi di blocchi:– Execute– Let– Output– Table– Function– Query– Script– Iterate
36
Alcuni elementi di OPLA 2
• Inizio tipico
{"type" : "execute","do" : [{
…
37
Struttura di reportRicezione 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
38
Acquisizione variabili
{"type" : "execute","do" : [{"type" : "let","value" : {"debugMode" : "false","da" : "${arg0}","a" : "${arg1}","range" : "${arg2}"
39
Esecuzione OFunction
{"type" : "function","function" : "getClassName","args" : [
"DatiContabiliSala",null,"${range}"
],"return" : "className"
}
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"
}
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]}'), '' ) }"
}}
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 ){
43
Un ultimo passaggio
• Il JSON viene processato dalla funzione processResult della libreria orientdb-bi
• Verranno formattati header, body e footer
JSON
orientdb-bi
44
Il risultato
45
App: Archivio Commerciale
• Esigenza: informatizzare le visite delle sale• Soluzione: OrientBI– Command– JS– JQueryUI
Scheda Sala
Upload/Download file e foto
Aggiornamento DB
46
Come si presenta
47
Qualche dettaglio
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);
} elsealert(db.getErrorMessage());
49
Alcuni dati salvati
EmbeddedMap
Collection
50
E le storie di vita vissuta?
• Local
• Indici
• Backup
• OPLA & Debug
• SNAPSHOT
• Aggregazioni
51
Robustezza(…) e velocità
Orient 1.4 = Local + MVRB-Tree
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!
53
Come correggere i danni?
Come si ricostruisce una città dopo il passaggio di Godzilla?Solo avendo una città di backup!
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
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
56
Quando sarà rilasciato?
• Solo lui ci può rispondere…
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à
58
Come è andata?
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…
60
RoadMap 2.0
• Protocollo binario (3x – 20x)• Indici nel WAL• Improvement Multicore• Visualizzazione dei grafi su Studio• Altro…
61
Per il futuro?
2.0
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!
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à
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
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
66
Dov’è la parte graph?
• Nei flussi che contengono tutte le transazioni è stato seguito un approcio diverso: legare le date ad un grafo temporale
AnnoMese
Settimana
Giorno Ora
Minuti
Secondi
Record
Record
Record
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
68
Come ottimizzare le ricerche
AnnoMese
Settimana
Giorno Ora
Minuti
Secondi
Record
Record
Record
Aggr
Aggr
Aggr
Aggr
Aggr
Aggr
Aggr
n x 12
n Aggr
69
Quante dimensioni?
• Tipicamente temporale o temporale x territoriale
• Limite = n
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!
71
Quando è più indicato il graph?
• Utilizzare il grafo quando il costo di aggregazione è maggiore di quello di ricerca
Friend
out().in()
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
73
Feedback
Insomma parafrasando Edward Norton
‘’Orient spacca!’’
Grazieluca.bianconi@assetdata.it
75
#AssetCercaCollaboratori
jobs@assetdata.it