orientdb & big data

Post on 21-Nov-2014

365 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

BigData & Graphs in Rome OrientDB & Big Data: storie di vita vissuta Da un caso di successo a un futuro che “spacca” Un backstage di un caso di successo con un occhio critico ai problemi avuti, ma con la consapevolezza di un futuro brillante. Il riassunto della nascita di una suite di business intelligence. By Luca Bianconi @LucaBianconi74

TRANSCRIPT

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

top related