SlideShare a Scribd company logo
1 of 20
GAE Intro
Firenze
29 Aprile 2010

          Google App Engine
             DataStore




                   Luca Masini
                 www.lucamasini.net
DataStore: caratteristiche [1]

Il Google App Engine Datastore è un sistema di
memorizzazione "schema-less", la cui unità fondamentale di
memorizzazione è l'Entity, formato da una Key immutabile e da
zero o più proprietà mutabili.

Gli Entity possono essere creati, aggiornati, cancellati, caricati
per Key e ricercati per valore delle proprietà tramite Query.

Il DataStore può essere usato in modo transazionale, anche
con il supporto della "current transaction".
DataStore: building blocks [2][3][6]
Il GAE DataStore è una tipica "composizione" di tecnologie
Google




                               Indici e transazionalità basati su MegaTable




                                                persistente grazie al GFS



                         distribuita grazie a Chubby
DataStore: BigTable

 Per usare in modo corretto il DataStore di GAE è
 necessario conoscere BigTable, componente che ne
 caratterizza la persistenza non relazionale.

 Le API JDO/JPA che GAE ci mette a disposizione
 infatti cercano di mostrarcelo come relazionale,
 rischiando però che il DataStore venga utilizzato
 come RDBMS.
BigTable: definizione [4]

"A Bigtable is a sparse, distributed, persistent multi-
              dimensional sorted map"

                          ovvero

 E' un array associativo :
     sparso perchè memorizza solo i valori non "vuoti"
     distribuito nel cloud di Google
     persistente sul Google File System
     multidimensionale nel numero di colonne
     ordinato lessicograficamente per chiave
BigTable: vista "fisica"

  La chiave è una terna:
     row: String
     column: String
     timestamp: long

  Ad ogni chiave è associato un valore che invece è un array
  di byte.
BigTable: vista logica (row)




  la row è sempre "com.cnn.www"
  abbiamo due famiglie di colonne: contents e anchor
  "contents" referenzia tre versioni di contenuto, HTML della
  pagina
  Le due "anchor" invece hanno una sola versione, con la
  descrizione del link.
BigTable: row string

  E' una stringa arbitraria, fino a 64kb, anche se di solito è
  composta di qualche decina di caratteri con un significato
  nel contesto del dominio del problema

  Le modifiche per riga sono atomiche in lettura e scrittura, a
  prescindere dal numero di colonne che si vanno a
  modificare (no multiriga)

  La riga è anche usata per mantenere ordinati
  lessicograficamente i dati e per partizionarli dinamicamente
BigTable: tablet

  Un range di dati ordinati per riga è chiamato "tablet"
  La "tablet" è l'unità minima di distribuzione e load-balancing
  (circa 200MB)
  Un accesso a dati per righe continue è molto efficiente
  perchè tocca il numero minimo di "tablet" e quindi di accessi
  a macchine remote
  E' importante in fase di design scegliere un principio di
  massima località per le righe
      Ad es. per l'ordinamento di righe di una table di
      indicizzazione può essere vantaggioso il reverse-domain
      order (ad.es net.lucamasini.www/page1.html e net.
      lucamasini.www/page2.html sono probabilmente nello
      stesso tablet)
BigTable: column families

  Le colonne sono raggruppate in "column families" che
  rappresentano l'unità di controllo degli accessi

  Si rappresentano con la sintassi:
      family:qualifier

  Un esempio di colonne può essere:
     language:it_IT
     anchor:com.yahoo.www
     anchor:com.google.www

  Su ogni singola famiglia di una BigTable possiamo decidere
  per ogni principal se può leggere, scrivere, aggiornare.
BigTable: timestamp

 La versione è mantenuta con un intero a 64bit
 Se "automatic" allora è assegnata da BigTable e
 rappresenta il tempo in microsecondi (?????)
 Un'applicazione può anche decidere di assegnarlo, facendo
 attenzione all'unicità
 Le righe sono memorizzate in ordine inverso di timestamp
 La garbage collection delle righe può avvenire secondo due
 politiche:
     ultime n versioni
     versioni più vecchie di un tempo T
 L'applicazione sceglie la politica di GC e il parametro di
 configurazione
BigTable: esempio scrittura
  // Apre la tabella dato il namespace
  Table t =
   BigTable.
     openOrDie("/bigtable/web/webtable");

   // Prepara un aggiornamento della riga
   RowMutation rm =
      new RowMutation(t, "com.cnn.www");
   rm.set("anchor:www.c-span.org", "CNN");
   rm.delete("anchor:www.abc.com");


   // Applica atomicamente la RowMutation
   Operation op = BigTable.apply(rm);
BigTable: esempio lettura
      Scanner scanner = new Scanner(t);

      ScanStream stream =
         scanner.fetchColumnFamily("anchor");
      stream.setReturnAllVersions(true);
      scanner.lookup("com.cnn.www");

      for (; !stream.done(); stream.next()) {
        System.printf("%s %s %lld %sn",
           scanner.getRowName(),
           stream.getColumnName(),
           stream.getMicroTimestamp(),
           stream.getValue());
      }
DataStore: JPA/JDO come astrazione della BigTable


  Come abbiamo visto le differenze rispetto ad un DB
  relazionale sono molte e decisive

  Disegnare il modello senza tenere di conto ad esempio di
  una modellazione corretta della Key può far decadere in
  modo definitivo le performance

  A questo aggiungiamo che per chi usa GWT come layer di
  presentation i modelli non sono “serializzabili” (a meno di
  qualche trucco o uso di librerie esterne)
DataStore: API dirette

  Può essere conveniente usare direttamente le API di
  accesso al DataStore, saltando lo strato JPA/JDO, così da
  sfruttare appieno le feature del repository distribuito.

  Con il comando di query asincrono possiamo anche
  lanciare più thread per eseguire le nostre query, che con un
  procedimento alla MapReduce divide il lavoro di selezione
  su più job che girano in parallelo nel cloud di Google [5].
DataStore: esempio d'uso

 Entity paramEntity = new Entity(KIND);
 paramEntity.setProperty("nome", "Luca");
 paramEntity.setProperty("cognome", "Masini");
 final DatastoreService datastoreService =
    DatastoreServiceFactory.getDatastoreService();

 Key key = datastoreService.put(paramEntity);

 PreparedQuery pq = datastoreService.prepare(
   new Query(KIND));

 for(Entity entity: pq.asIterable()) {
   ....
 }
DataStore: problemi

 GQL non supporta operatori comuni di SQL, come LIKE e
 OR
 Trattandosi di un repository non relazionale dobbiamo
 gestire "manualmente" le relazioni tra le varie entità



SELECT *
FROM indirizzi a, persone b
WHERE b.id_indirizzo = a.id
AND (b.nome = 'Luca' OR b.nome='Alberto')
OR a.comune like 'F%'
DataStore: il relazionale è dentro di noi

Ricordiamoci sempre che siamo abituati a pensare in termini
relazionali perchè la tecnologia vincente degli ultimi 35 anni è
stata proprio il DataBase Management System Relazionale .

Spesso siamo convinti che tutte le soluzioni abbiano una buona
implementazione relazionale, ma questo non è assolutamente
vero, basta pensare alla fatica che dobbiamo fare per mappare
le nostre gerarchie di oggetti Java anche con i più moderni
ORM.

E' su questa "forma mentis" che dobbiamo lavorare per poter
usare a pieno i nuovi strumenti di Cloud-Computing che Google
ad altri vendor ci stanno mettendo a disposizione.
DataStore: domande per Ikai

 Dov'è finità la possibilità di versionare i contenuti, nativa di
 BigTable ??
 Credono di rendere disponibili API che permettano una più
 facile parallelizzazione delle query, per sfruttare a pieno le
 caratteristiche di BigTable e del Cloud ?
 In alternativa alla precedente, potrebbero darci la possibilità
 di usare algoritmi alla MapReduce
 Pensano di darci la possibilità di indicizzare anche il
 contenuto e non solo le column-families ?
 Hanno in ponte un RESTful gateway per il DataStore di
 GAE ??
 Modellazione con JPA/JDO o DataStore API ??
Riferimenti

 1. http://code.google.com/intl/it-IT/appengine/docs/java/datastore/overview.
    html
 2. http://perspectives.mvdirona.com/2008/07/10/GoogleMegastore.aspx
 3. http://snarfed.org/space/datastore_talk.html
 4. http://labs.google.com/papers/bigtable.html
 5. http://code.google.com/p/twig-persist
 6. http://labs.google.com/papers/chubby.html
 7. http://aws.amazon.com/rds/
 8. http://aws.amazon.com/simpledb/
 9. http://www.readwriteweb.com/enterprise/2009/02/is-the-relational-
    database-doomed.php
10. http://oakleafblog.blogspot.com/2008/04/comparing-google-app-engine-
    amazon.html
11. http://www.vineetgupta.com/2010/01/nosql-databases-part-1-landscape.
    html

More Related Content

Similar to Introduzione a google_app_engine_datastore

MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009Massimiliano Dessì
 
Build a LINQ-enabled Repository
Build a LINQ-enabled RepositoryBuild a LINQ-enabled Repository
Build a LINQ-enabled RepositoryAndrea Saltarello
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateManuel Scapolan
 
MongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework MeetingMongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework Meetingguest67beeb9
 
MongoDB
MongoDBMongoDB
MongoDBNaLUG
 
Community Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure OverviewCommunity Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure OverviewFabio Cozzolino
 
[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 frameworkDrupalDay
 
Async navigation with a lightweight ES6 framework
Async navigation with a lightweight ES6 frameworkAsync navigation with a lightweight ES6 framework
Async navigation with a lightweight ES6 frameworksparkfabrik
 
Oltre il modello relazionale
Oltre il modello relazionaleOltre il modello relazionale
Oltre il modello relazionalefcami87
 
Code Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryCode Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryAndrea Saltarello
 
Big data stack tecnologico
Big data stack tecnologicoBig data stack tecnologico
Big data stack tecnologicoMassimo Romano
 
Introduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big DataIntroduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big DataVincenzo Manzoni
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Fabio Armani
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRSManuel Scapolan
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteGiuseppe Toto
 

Similar to Introduzione a google_app_engine_datastore (20)

MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009MongoDB SpringFramework Meeting september 2009
MongoDB SpringFramework Meeting september 2009
 
Build a LINQ-enabled Repository
Build a LINQ-enabled RepositoryBuild a LINQ-enabled Repository
Build a LINQ-enabled Repository
 
Entity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernateEntity Framework 4.0 vs NHibernate
Entity Framework 4.0 vs NHibernate
 
MongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework MeetingMongoDb and Scala SpringFramework Meeting
MongoDb and Scala SpringFramework Meeting
 
MongoDB
MongoDBMongoDB
MongoDB
 
Community Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure OverviewCommunity Tour 2009 Windows Azure Overview
Community Tour 2009 Windows Azure Overview
 
[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework[drupalday2017] - Async navigation with a lightweight ES6 framework
[drupalday2017] - Async navigation with a lightweight ES6 framework
 
Async navigation with a lightweight ES6 framework
Async navigation with a lightweight ES6 frameworkAsync navigation with a lightweight ES6 framework
Async navigation with a lightweight ES6 framework
 
MongoDB
MongoDBMongoDB
MongoDB
 
Oltre il modello relazionale
Oltre il modello relazionaleOltre il modello relazionale
Oltre il modello relazionale
 
Appunti di big data
Appunti di big dataAppunti di big data
Appunti di big data
 
Database Data Aggregator
Database Data AggregatorDatabase Data Aggregator
Database Data Aggregator
 
Code Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled RepositoryCode Contracts and Generics: implementing a LINQ-enabled Repository
Code Contracts and Generics: implementing a LINQ-enabled Repository
 
Bootstrap
BootstrapBootstrap
Bootstrap
 
Big data stack tecnologico
Big data stack tecnologicoBig data stack tecnologico
Big data stack tecnologico
 
Lezione js pdatabasecrudterzaparte
Lezione js pdatabasecrudterzaparteLezione js pdatabasecrudterzaparte
Lezione js pdatabasecrudterzaparte
 
Introduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big DataIntroduzione ai Big Data e alla scienza dei dati - Big Data
Introduzione ai Big Data e alla scienza dei dati - Big Data
 
Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)Design Patterns - enterprise patterns (part I)
Design Patterns - enterprise patterns (part I)
 
Domain Driven Design e CQRS
Domain Driven Design e CQRSDomain Driven Design e CQRS
Domain Driven Design e CQRS
 
Sencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parteSencha touch: Sviluppare un'app - 4° parte
Sencha touch: Sviluppare un'app - 4° parte
 

More from firenze-gtug

Html5 apps - GWT oriented
Html5 apps - GWT orientedHtml5 apps - GWT oriented
Html5 apps - GWT orientedfirenze-gtug
 
Android ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi IntelAndroid ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi Intelfirenze-gtug
 
Gwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca TosiGwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca Tosifirenze-gtug
 
Youtube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'AmbrosioYoutube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'Ambrosiofirenze-gtug
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosiofirenze-gtug
 
Arduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'AmbrosioArduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'Ambrosiofirenze-gtug
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugianifirenze-gtug
 
RFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano ColucciniRFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano Coluccinifirenze-gtug
 
GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)firenze-gtug
 
Presentazione Google App Engine
Presentazione Google App EnginePresentazione Google App Engine
Presentazione Google App Enginefirenze-gtug
 
Android chat in the cloud
Android chat in the cloudAndroid chat in the cloud
Android chat in the cloudfirenze-gtug
 
Clean android code
Clean android codeClean android code
Clean android codefirenze-gtug
 
Intel ndk - a few Benchmarks
Intel ndk - a few BenchmarksIntel ndk - a few Benchmarks
Intel ndk - a few Benchmarksfirenze-gtug
 
EE Incremental Store
EE Incremental StoreEE Incremental Store
EE Incremental Storefirenze-gtug
 
Programming objects with android
Programming objects with androidProgramming objects with android
Programming objects with androidfirenze-gtug
 
Apertura "Mobile & Embedded" - 13 febbraio 2014
Apertura "Mobile & Embedded" - 13 febbraio 2014Apertura "Mobile & Embedded" - 13 febbraio 2014
Apertura "Mobile & Embedded" - 13 febbraio 2014firenze-gtug
 
Maven from dummies
Maven from dummiesMaven from dummies
Maven from dummiesfirenze-gtug
 
Dev fest android application case study
Dev fest android application   case studyDev fest android application   case study
Dev fest android application case studyfirenze-gtug
 

More from firenze-gtug (20)

Html5 apps - GWT oriented
Html5 apps - GWT orientedHtml5 apps - GWT oriented
Html5 apps - GWT oriented
 
Android ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi IntelAndroid ndk - ottimizzazione su dispositivi Intel
Android ndk - ottimizzazione su dispositivi Intel
 
Gwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca TosiGwt kickoff - Alberto Mancini & Francesca Tosi
Gwt kickoff - Alberto Mancini & Francesca Tosi
 
Youtube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'AmbrosioYoutube broadcast live - Massimiliano D'Ambrosio
Youtube broadcast live - Massimiliano D'Ambrosio
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosio
 
Arduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'AmbrosioArduino - Massimiliano D'Ambrosio
Arduino - Massimiliano D'Ambrosio
 
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo BugianiIntroduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
Introduzione a GAE - Alessandro Aglietti e Lorenzo Bugiani
 
RFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano ColucciniRFID: What & Why - Stefano Coluccini
RFID: What & Why - Stefano Coluccini
 
GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)GWT - AppDays - (25 aprile 2014, pordenone)
GWT - AppDays - (25 aprile 2014, pordenone)
 
Presentazione Google App Engine
Presentazione Google App EnginePresentazione Google App Engine
Presentazione Google App Engine
 
Android chat in the cloud
Android chat in the cloudAndroid chat in the cloud
Android chat in the cloud
 
Clean android code
Clean android codeClean android code
Clean android code
 
#Html2Native
#Html2Native#Html2Native
#Html2Native
 
Intel ndk - a few Benchmarks
Intel ndk - a few BenchmarksIntel ndk - a few Benchmarks
Intel ndk - a few Benchmarks
 
EE Incremental Store
EE Incremental StoreEE Incremental Store
EE Incremental Store
 
Programming objects with android
Programming objects with androidProgramming objects with android
Programming objects with android
 
Apertura "Mobile & Embedded" - 13 febbraio 2014
Apertura "Mobile & Embedded" - 13 febbraio 2014Apertura "Mobile & Embedded" - 13 febbraio 2014
Apertura "Mobile & Embedded" - 13 febbraio 2014
 
Maven from dummies
Maven from dummiesMaven from dummies
Maven from dummies
 
Apps fuel oct2012
Apps fuel oct2012Apps fuel oct2012
Apps fuel oct2012
 
Dev fest android application case study
Dev fest android application   case studyDev fest android application   case study
Dev fest android application case study
 

Introduzione a google_app_engine_datastore

  • 1. GAE Intro Firenze 29 Aprile 2010 Google App Engine DataStore Luca Masini www.lucamasini.net
  • 2. DataStore: caratteristiche [1] Il Google App Engine Datastore è un sistema di memorizzazione "schema-less", la cui unità fondamentale di memorizzazione è l'Entity, formato da una Key immutabile e da zero o più proprietà mutabili. Gli Entity possono essere creati, aggiornati, cancellati, caricati per Key e ricercati per valore delle proprietà tramite Query. Il DataStore può essere usato in modo transazionale, anche con il supporto della "current transaction".
  • 3. DataStore: building blocks [2][3][6] Il GAE DataStore è una tipica "composizione" di tecnologie Google Indici e transazionalità basati su MegaTable persistente grazie al GFS distribuita grazie a Chubby
  • 4. DataStore: BigTable Per usare in modo corretto il DataStore di GAE è necessario conoscere BigTable, componente che ne caratterizza la persistenza non relazionale. Le API JDO/JPA che GAE ci mette a disposizione infatti cercano di mostrarcelo come relazionale, rischiando però che il DataStore venga utilizzato come RDBMS.
  • 5. BigTable: definizione [4] "A Bigtable is a sparse, distributed, persistent multi- dimensional sorted map" ovvero E' un array associativo : sparso perchè memorizza solo i valori non "vuoti" distribuito nel cloud di Google persistente sul Google File System multidimensionale nel numero di colonne ordinato lessicograficamente per chiave
  • 6. BigTable: vista "fisica" La chiave è una terna: row: String column: String timestamp: long Ad ogni chiave è associato un valore che invece è un array di byte.
  • 7. BigTable: vista logica (row) la row è sempre "com.cnn.www" abbiamo due famiglie di colonne: contents e anchor "contents" referenzia tre versioni di contenuto, HTML della pagina Le due "anchor" invece hanno una sola versione, con la descrizione del link.
  • 8. BigTable: row string E' una stringa arbitraria, fino a 64kb, anche se di solito è composta di qualche decina di caratteri con un significato nel contesto del dominio del problema Le modifiche per riga sono atomiche in lettura e scrittura, a prescindere dal numero di colonne che si vanno a modificare (no multiriga) La riga è anche usata per mantenere ordinati lessicograficamente i dati e per partizionarli dinamicamente
  • 9. BigTable: tablet Un range di dati ordinati per riga è chiamato "tablet" La "tablet" è l'unità minima di distribuzione e load-balancing (circa 200MB) Un accesso a dati per righe continue è molto efficiente perchè tocca il numero minimo di "tablet" e quindi di accessi a macchine remote E' importante in fase di design scegliere un principio di massima località per le righe Ad es. per l'ordinamento di righe di una table di indicizzazione può essere vantaggioso il reverse-domain order (ad.es net.lucamasini.www/page1.html e net. lucamasini.www/page2.html sono probabilmente nello stesso tablet)
  • 10. BigTable: column families Le colonne sono raggruppate in "column families" che rappresentano l'unità di controllo degli accessi Si rappresentano con la sintassi: family:qualifier Un esempio di colonne può essere: language:it_IT anchor:com.yahoo.www anchor:com.google.www Su ogni singola famiglia di una BigTable possiamo decidere per ogni principal se può leggere, scrivere, aggiornare.
  • 11. BigTable: timestamp La versione è mantenuta con un intero a 64bit Se "automatic" allora è assegnata da BigTable e rappresenta il tempo in microsecondi (?????) Un'applicazione può anche decidere di assegnarlo, facendo attenzione all'unicità Le righe sono memorizzate in ordine inverso di timestamp La garbage collection delle righe può avvenire secondo due politiche: ultime n versioni versioni più vecchie di un tempo T L'applicazione sceglie la politica di GC e il parametro di configurazione
  • 12. BigTable: esempio scrittura // Apre la tabella dato il namespace Table t = BigTable. openOrDie("/bigtable/web/webtable"); // Prepara un aggiornamento della riga RowMutation rm = new RowMutation(t, "com.cnn.www"); rm.set("anchor:www.c-span.org", "CNN"); rm.delete("anchor:www.abc.com"); // Applica atomicamente la RowMutation Operation op = BigTable.apply(rm);
  • 13. BigTable: esempio lettura Scanner scanner = new Scanner(t); ScanStream stream = scanner.fetchColumnFamily("anchor"); stream.setReturnAllVersions(true); scanner.lookup("com.cnn.www"); for (; !stream.done(); stream.next()) { System.printf("%s %s %lld %sn", scanner.getRowName(), stream.getColumnName(), stream.getMicroTimestamp(), stream.getValue()); }
  • 14. DataStore: JPA/JDO come astrazione della BigTable Come abbiamo visto le differenze rispetto ad un DB relazionale sono molte e decisive Disegnare il modello senza tenere di conto ad esempio di una modellazione corretta della Key può far decadere in modo definitivo le performance A questo aggiungiamo che per chi usa GWT come layer di presentation i modelli non sono “serializzabili” (a meno di qualche trucco o uso di librerie esterne)
  • 15. DataStore: API dirette Può essere conveniente usare direttamente le API di accesso al DataStore, saltando lo strato JPA/JDO, così da sfruttare appieno le feature del repository distribuito. Con il comando di query asincrono possiamo anche lanciare più thread per eseguire le nostre query, che con un procedimento alla MapReduce divide il lavoro di selezione su più job che girano in parallelo nel cloud di Google [5].
  • 16. DataStore: esempio d'uso Entity paramEntity = new Entity(KIND); paramEntity.setProperty("nome", "Luca"); paramEntity.setProperty("cognome", "Masini"); final DatastoreService datastoreService = DatastoreServiceFactory.getDatastoreService(); Key key = datastoreService.put(paramEntity); PreparedQuery pq = datastoreService.prepare( new Query(KIND)); for(Entity entity: pq.asIterable()) { .... }
  • 17. DataStore: problemi GQL non supporta operatori comuni di SQL, come LIKE e OR Trattandosi di un repository non relazionale dobbiamo gestire "manualmente" le relazioni tra le varie entità SELECT * FROM indirizzi a, persone b WHERE b.id_indirizzo = a.id AND (b.nome = 'Luca' OR b.nome='Alberto') OR a.comune like 'F%'
  • 18. DataStore: il relazionale è dentro di noi Ricordiamoci sempre che siamo abituati a pensare in termini relazionali perchè la tecnologia vincente degli ultimi 35 anni è stata proprio il DataBase Management System Relazionale . Spesso siamo convinti che tutte le soluzioni abbiano una buona implementazione relazionale, ma questo non è assolutamente vero, basta pensare alla fatica che dobbiamo fare per mappare le nostre gerarchie di oggetti Java anche con i più moderni ORM. E' su questa "forma mentis" che dobbiamo lavorare per poter usare a pieno i nuovi strumenti di Cloud-Computing che Google ad altri vendor ci stanno mettendo a disposizione.
  • 19. DataStore: domande per Ikai Dov'è finità la possibilità di versionare i contenuti, nativa di BigTable ?? Credono di rendere disponibili API che permettano una più facile parallelizzazione delle query, per sfruttare a pieno le caratteristiche di BigTable e del Cloud ? In alternativa alla precedente, potrebbero darci la possibilità di usare algoritmi alla MapReduce Pensano di darci la possibilità di indicizzare anche il contenuto e non solo le column-families ? Hanno in ponte un RESTful gateway per il DataStore di GAE ?? Modellazione con JPA/JDO o DataStore API ??
  • 20. Riferimenti 1. http://code.google.com/intl/it-IT/appengine/docs/java/datastore/overview. html 2. http://perspectives.mvdirona.com/2008/07/10/GoogleMegastore.aspx 3. http://snarfed.org/space/datastore_talk.html 4. http://labs.google.com/papers/bigtable.html 5. http://code.google.com/p/twig-persist 6. http://labs.google.com/papers/chubby.html 7. http://aws.amazon.com/rds/ 8. http://aws.amazon.com/simpledb/ 9. http://www.readwriteweb.com/enterprise/2009/02/is-the-relational- database-doomed.php 10. http://oakleafblog.blogspot.com/2008/04/comparing-google-app-engine- amazon.html 11. http://www.vineetgupta.com/2010/01/nosql-databases-part-1-landscape. html