Download - OrientDB & Big Data

Transcript
Page 1: OrientDB & Big Data

OrientDB & Big Data:storie di vita vissuta

Da un caso di successoa un futuro che “spacca”

BigData & Graphs in Rome

Page 2: OrientDB & Big Data

2

Luca BianconiSenior Consultant

Partner Italianodi Orient Technologies UK

Page 3: OrientDB & Big Data

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)

Page 4: OrientDB & Big Data

4

La nuova direzione

Trick

StressCorrelato

SKY

Apprendistato

Page 5: OrientDB & Big Data

5

La richiesta

Sviluppare un sistema di BI (real time)per le VLT di una famosa società italiana

di gaming

Page 6: OrientDB & Big Data

6

Cosa sono le VLT

Video Lottery Terminal

Page 7: OrientDB & Big Data

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

Page 8: OrientDB & Big Data

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

Page 9: OrientDB & Big Data

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…

Page 10: OrientDB & Big Data

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’

Page 11: OrientDB & Big Data

11

L’implementazione

Serve un multi-model graph database!

Page 12: OrientDB & Big Data

12

C’è tanto da fare

Ok abbiamo il DB: Orient 1.3. E adesso?

Page 13: OrientDB & Big Data

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 $$$

Page 14: OrientDB & Big Data

14

Architettura finale

PLATFORM 1

PLATFORM 2

PLATFORM 4

OrientBI

GRAFICI

REPORT

SCHEDEMODIFICABILI

PLATFORM 3

Page 15: OrientDB & Big Data

15

La lista della spesa

• ETL•Back end• Front end•Report•Applicazione

Page 16: OrientDB & Big Data

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:…………………………….

Page 17: OrientDB & Big Data

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

Page 18: OrientDB & Big Data

18

ETL parte 2

‘’BODY’’

@onBeforeFile {{{…}}}@onBeforeLine {{{@onAfterFile {{{@onAfterLine {{{… [record.save();]}}}

Page 19: OrientDB & Big Data

19

ETL e linguaggi

• Rhino

• Se viene utilizzato Java 8 il motore sarà Nashorn– Prestazioni equiparabili a Google V8

Page 20: OrientDB & Big Data

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

Page 21: OrientDB & Big Data

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);

Page 22: OrientDB & Big Data

22

1° POC

• >> 1000 rec/sec

• Ok ‘’It works!’’

• Come vedo se ha importato i dati?

• La console è scomoda… usa

Studio!

Page 23: OrientDB & Big Data

23

Il primo Studio

Page 24: OrientDB & Big Data

24

Il secondo Studio

Page 25: OrientDB & Big Data

25

Boe dammi una Duff!

Page 26: OrientDB & Big Data

26

E’ sufficiente?• 120.000.000 (record) ÷ 1.200

(record/secondo)• + o - fanno 28 ore…• E il real time?

DarvazaTurkmenistanPorta dell’inferno

Page 27: OrientDB & Big Data

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

Page 28: OrientDB & Big Data

28

Pericolo scampato

• Risultato = 25.000 r/s (1h e ½ per l’import)

Page 29: OrientDB & Big Data

29

Front end

• I dati ci sono• Visualizziamoli

Page 30: OrientDB & Big Data

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

Page 31: OrientDB & Big Data

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();

}

Page 33: OrientDB & Big Data

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());

});

Page 34: OrientDB & Big Data

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

Page 35: OrientDB & Big Data

35

Alcuni elementi di OPLA 1

• Comprende 8 tipi di blocchi:– Execute– Let– Output– Table– Function– Query– Script– Iterate

Page 36: OrientDB & Big Data

36

Alcuni elementi di OPLA 2

• Inizio tipico

{"type" : "execute","do" : [{

Page 37: OrientDB & Big Data

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

Page 38: OrientDB & Big Data

38

Acquisizione variabili

{"type" : "execute","do" : [{"type" : "let","value" : {"debugMode" : "false","da" : "${arg0}","a" : "${arg1}","range" : "${arg2}"

Page 39: OrientDB & Big Data

39

Esecuzione OFunction

{"type" : "function","function" : "getClassName","args" : [

"DatiContabiliSala",null,"${range}"

],"return" : "className"

}

Page 40: OrientDB & Big Data

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"

}

Page 41: OrientDB & Big Data

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]}'), '' ) }"

}}

Page 42: OrientDB & Big Data

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 ){

Page 43: OrientDB & Big Data

43

Un ultimo passaggio

• Il JSON viene processato dalla funzione processResult della libreria orientdb-bi

• Verranno formattati header, body e footer

JSON

orientdb-bi

Page 44: OrientDB & Big Data

44

Il risultato

Page 45: OrientDB & Big Data

45

App: Archivio Commerciale

• Esigenza: informatizzare le visite delle sale• Soluzione: OrientBI– Command– JS– JQueryUI

Scheda Sala

Upload/Download file e foto

Aggiornamento DB

Page 46: OrientDB & Big Data

46

Come si presenta

Page 47: OrientDB & Big Data

47

Qualche dettaglio

Page 48: OrientDB & Big Data

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());

Page 49: OrientDB & Big Data

49

Alcuni dati salvati

EmbeddedMap

Collection

Page 50: OrientDB & Big Data

50

E le storie di vita vissuta?

• Local

• Indici

• Backup

• OPLA & Debug

• SNAPSHOT

• Aggregazioni

Page 51: OrientDB & Big Data

51

Robustezza(…) e velocità

Orient 1.4 = Local + MVRB-Tree

Page 52: OrientDB & Big Data

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!

Page 53: OrientDB & Big Data

53

Come correggere i danni?

Come si ricostruisce una città dopo il passaggio di Godzilla?Solo avendo una città di backup!

Page 54: OrientDB & Big Data

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

Page 55: OrientDB & Big Data

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

Page 56: OrientDB & Big Data

56

Quando sarà rilasciato?

• Solo lui ci può rispondere…

Page 57: OrientDB & Big Data

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à

Page 58: OrientDB & Big Data

58

Come è andata?

Page 59: OrientDB & Big Data

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…

Page 60: OrientDB & Big Data

60

RoadMap 2.0

• Protocollo binario (3x – 20x)• Indici nel WAL• Improvement Multicore• Visualizzazione dei grafi su Studio• Altro…

Page 61: OrientDB & Big Data

61

Per il futuro?

2.0

Page 62: OrientDB & Big Data

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!

Page 63: OrientDB & Big Data

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à

Page 64: OrientDB & Big Data

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

Page 65: OrientDB & Big Data

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

Page 66: OrientDB & Big Data

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

Page 67: OrientDB & Big Data

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

Page 68: OrientDB & Big Data

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

Page 69: OrientDB & Big Data

69

Quante dimensioni?

• Tipicamente temporale o temporale x territoriale

• Limite = n

Page 70: OrientDB & Big Data

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!

Page 71: OrientDB & Big Data

71

Quando è più indicato il graph?

• Utilizzare il grafo quando il costo di aggregazione è maggiore di quello di ricerca

Friend

out().in()

Page 72: OrientDB & Big Data

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

Page 73: OrientDB & Big Data

73

Feedback

Insomma parafrasando Edward Norton

‘’Orient spacca!’’

Page 75: OrientDB & Big Data

75

#AssetCercaCollaboratori

[email protected]


Top Related