N(ot) O(nly) SQLDes alternatives aux bases de données relationnellesMALLASSI OlivierOCTOTechnologyEmail : omallassi@octo.comTwitter : @omallassiLinkedIn : http://www.linkedin.com/pub/olivier-mallassi/1/46/21 Blog : http://blog.octo.com
Objectifs Proposer une vision synthétique du « monde NoSQL »Fournir un premier guide de lecturehttp://www.flickr.com/photos/nuagedenuit/155699074/sizes/o/
@omallassiArchitecte @OCTOhttp://blog.octo.comnoSQL User Group @Paris#nosqlfr3
La génèse…
Au commencement était……le fichier séquentiel (indexé)…… et COBOLUne interrogation « limitée », par indexSELECT BookFile ASSIGN TO "BOOKS.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS BookNumberALTERNATE RECORD KEY IS AuthorNumber WITH DUPLICATESFILE STATUS IS BookErrorStatus.…
Vers 1970les premiers modèles relationnelsUn référentiel unique de données structurées et coupléesUn système centraliséUne donnée unique (structure, valeur, consistance…) pour toutes les utilisationsOn modélise les données puis on développe des applications
Puis vinrent…Objectif : stocker et rechercher dans le web en temps réelObjectif : vendre la plus grande variétéd’articles (livres, bricolage…)Des enjeux communs Performance (malgré les volumétries)Disponibilité (>99,99%)Résilience Scalabilité horizontaleEnjeux : Agréger de gros volumes de données BigTable + Map/ReduceEnjeuxDébit important en écriture tout en assurant la disponibilitéDerniers incidents majeurs : 2004<40 minutes d’indisponibilité par an Dynamo
Et dans le même temps,Le secteur de la finance se lancent dans une course à la latence…Lowlatency messagingGrille de calcul…et aide au développement des « caches distribués » : Data Grid
NoSQL aujourd’huiun foisonnement de solutions…
Hadoople modèle Google
HadoopUn écosystème riche et complexeUne « stack » complexeLe cauchemar de la compatibilité des versionsDes leaders différents : Apache, Cloudera…Des équipes distinctes : Hive, Hadoop, Sqoop…PigDataflowlanguage & compilerHiveSQL LikequeriesDSLOozieWorkflow for interdependentHadoop JobsMapReduceFramework permettant de « cruncher » des données en parallèleSqoopIntégration RDBMS & HadoopHbaseBase de données pour des accès aléatoires read/writeZookeeperService de coordinationHDFSUn système de fichiers distribuésWrite-once, readmanyFlume, Chukwa, ScribeCollection de données fiable et résiliente
HadoopDistributed File SystemUn système de fichier distribuéPermet de stocker des fichiers plus volumineux que ce que peut contenir un disque dur…Répartir les données sur plusieurs machines physiquesRépliquer ces données pour assurer le « fail-over » ? N * le volume de donnéescore-site.xmlhdfs-site.xmlmasters, slavesTaille des blocs : dfs.block.size (64MB par défaut)Config. des réplicas (par défaut 3)dfs.replication : le nombre de réplicadfs.replication.min : le nombre de réplica à assurer pour valider une écriture
MapReduceLe système de requêtage : MapReduceTraiter des volumes de données plus faiblesParalléliser ces traitements « plus » unitairesCo-localiser traitements / donnéesmastersslavescore-site.xmlhdfs-site.xmlmapred-site.xmlhadoop-metrics.propertieslog4j.propertieshadoop-env.sh
MapReduceOverview
MapReducePrincipe de l’algorithmeObjectif : réaliser la somme des deals sur un axe d’agrégationGEDEQSWAP   John    15/09/2010  EUR10200 CreditSGGEDSWAPTION  John   14/09/2010  EUR11000 CreditHSBC…GEDSWAPTION  John   17/09/2010  EUR    5500  CreditHSBCIRDIRS       Simon  13/09/2010  USD10000  DebitSGIRDIRS       Simon  14/09/2010  USD11000  CreditBoF(K1, V1)Mapagrégation par deviseEUR    10200USD    -10000EUR     11000EUR     5500USD     11000List(K2, V2)Shuffle & SortEUR     10200,11000, 5500USD      -10000,11000K2,list(V2)Reducesomme sur l’axe d’agrégationItération sur l’ensemble des K2EUR    26700USD    1000List(K3, V3)
L’avantage d’un DSLimport org.apache.hadoop.mapred; public static class MapextendsMapReduceBaseimplements Mapper {      public voidmap(LongWritablekey, Text value, OutputCollector output, Reporter reporter) throwsIOException {        String line = value.toString();        String[] lineAsArray = line.split("\t");        String currentCurrency = lineAsArray[4];        String amountAsString = lineAsArray[5];        String sens = lineAsArray[6];DoubleWritable data = null;        if("Debit".equals(sens)){        	data = new DoubleWritable(Double.parseDouble("-" + amountAsString));        }else if("Credit".equals(sens)) {        	data = new DoubleWritable(Double.parseDouble(amountAsString));        }output.collect(new Text(currentCurrency), data);        }      }SELECT Currency, SUM(Amount) FROMcash_flowWHERE Direction='Credit' AND DueDate &lt; = unix_timestamp('2010-09-15 00:00:00') GROUP BY Currencypublic class CurrencyAggregateextendsConfiguredimplementsTool {@Overridepublic intrun(String[] args) throws Exception{JobConfconf = new JobConf(CurrencyAggregate.class);conf.setJobName("CurrencyAggregate");	//output of the Mapper	);conf.setOutpconf.setOutputKeyClass(Text.classutValueClass(DoubleWritable.class);conf.setMapperClass(Map.class);conf.setReducerClass(Reduce.class);conf.setInputFormat(TextInputFormat.class);conf.setOutputFormat(TextOutputFormat.class);FileInputFormat.setInputPaths(conf, new Path(args[0]));FileOutputFormat.setOutputPath(conf, new Path(args[1]));JobClient.runJob(conf);        return 0;	}public staticvoid main(String[] args) throws Exception {intexitCode = ToolRunner.run(new CurrencyAggregate(), args);System.exit(exitCode);}/The reduce is called once per key in the output map of the map() function public static class Reduce extends MapReduceBase implements Reducer {	public void reduce(Text key, Iterator values, OutputCollector output, Reporter reporter) throws IOException {        double sum = 0;        while (values.hasNext()) {        	double amount = values.next().get();        	sum += amount;        }output.collect(key, new DoubleWritable(sum));      }}
Hashmap distribuéele modèle Amazon : Dynamo, S3, SimpleDB, Cassandra, Riak, Voldemort…
Rappelez vous…Objectif : stocker et rechercher dans le web en temps réelObjectif : vendre la plus grande variétéd’articles (livres, bricolage…)Des enjeux communs Performance (malgré les volumétries)Disponibilité (>99,99%)Résilience Scalabilité horizontaleEnjeux : Agréger de gros volumes de données BigTable + Map/ReduceEnjeuxDébit important en écriture tout en assurant la disponibilitéDerniers incidents majeurs : 2004<40 minutes d’indisponibilité par an Dynamo
Des enjeux différents de ceux de GoogleUn objectif « simple » : être capable d’accepter une demande d’achat……quelque soit la panne !Enjeux: reporting(induit une modélisation riche), Indisponibilité temporaire acceptableEnjeux: disponibilité en écriture, tolérance à la panneLe modèle RDBMS atteint ces limites en termeDébit en écriture
Disponibilité
Gestion du « capacity planning » Le modèle RDBMS est adaptéMassivement en lecture
Besoin de reporting
…Des gènes différents, centrés sur la disponibilité qui imposent des « trade-offs »Trade-off : « weforfeit ‘C’ and ‘I’ for availibility, gracefuldegradation and performance »De ACID vers BASE (WeakConsistency, Best Effort, Stale State…)Un système « élastique »Souplesse du schémaSouplesse de l’infrastructureUn modèle tolérant à la panneRéplication des données entre les serveursMode master / masterUn modèle qui privilégie la disponibilité et propose une gestion fine de la consistance« Eventually Consistent »Un modèle clé/valeur distribuéPermet de répartir le flux de de requêtes
Hashmap distribuéeModèle de donnéesModèle de données : une MapCassandra offre un modèle de données « plus riche » en reprenant le modèle « column-oriented » de BigTable : un Map de MapSans aller jusqu’au stockage physique en colonnePropose des index secondaires (v.0.7) : get users where state = 'UT' and birth_date > 1970;
« Event Sourcing »Le pattern…vision « stock » ou « mouvements »?09/2010		400	Credit13/09/2010	10000	Debit15/09/2010	10200	Credit14/09/2010	11000	Credit15/09/2010	5500 	Debit16/09/2010 	5500	Debit15/09/2010	11000 	Debit16/09/2010 	5500	Credit17/09/2010 	5500 	Credit13/09/2010 	10000 	Debit15/09/2010 	10200 	Credit13/09/2010	20000	Debit14/09/2010	11000	Credit15/09/2010	3900	Credit16/09/2010 	0	Credit17/09/2010 	5500 	Credit
« Event Sourcing »Le pattern…Permet d’adresser des enjeux différentsSource d’évènements, collecteDurable
Hautement disponible-…Des représentations adaptées aux usages, restitutionRDBMS
Graph
…Hashmap distribuée PartitionnementLe partitionnement et l’association clé/serveur sont assurés via « consistent hashing »Clientmd5(key) = 3#2«3»
Hashmap distribuée Gestion de la consistanceConsistance faibleConsistance forteClient(Write)Client(Read)Client(Write)Client(Read)Quorum basedprotocol : N/2 + 1 ou  W + R > NTrade off entre consistance, latence, tolérance à la panne en fonction de la donnée#2«3»#2«3»
Et les « Data Grids »?

mix-it 2011

  • 1.
    N(ot) O(nly) SQLDesalternatives aux bases de données relationnellesMALLASSI OlivierOCTOTechnologyEmail : omallassi@octo.comTwitter : @omallassiLinkedIn : http://www.linkedin.com/pub/olivier-mallassi/1/46/21 Blog : http://blog.octo.com
  • 2.
    Objectifs Proposer unevision synthétique du « monde NoSQL »Fournir un premier guide de lecturehttp://www.flickr.com/photos/nuagedenuit/155699074/sizes/o/
  • 3.
  • 4.
  • 5.
    Au commencement était……lefichier séquentiel (indexé)…… et COBOLUne interrogation « limitée », par indexSELECT BookFile ASSIGN TO "BOOKS.DAT" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS BookNumberALTERNATE RECORD KEY IS AuthorNumber WITH DUPLICATESFILE STATUS IS BookErrorStatus.…
  • 6.
    Vers 1970les premiersmodèles relationnelsUn référentiel unique de données structurées et coupléesUn système centraliséUne donnée unique (structure, valeur, consistance…) pour toutes les utilisationsOn modélise les données puis on développe des applications
  • 7.
    Puis vinrent…Objectif :stocker et rechercher dans le web en temps réelObjectif : vendre la plus grande variétéd’articles (livres, bricolage…)Des enjeux communs Performance (malgré les volumétries)Disponibilité (>99,99%)Résilience Scalabilité horizontaleEnjeux : Agréger de gros volumes de données BigTable + Map/ReduceEnjeuxDébit important en écriture tout en assurant la disponibilitéDerniers incidents majeurs : 2004<40 minutes d’indisponibilité par an Dynamo
  • 8.
    Et dans lemême temps,Le secteur de la finance se lancent dans une course à la latence…Lowlatency messagingGrille de calcul…et aide au développement des « caches distribués » : Data Grid
  • 9.
  • 10.
  • 11.
    HadoopUn écosystème richeet complexeUne « stack » complexeLe cauchemar de la compatibilité des versionsDes leaders différents : Apache, Cloudera…Des équipes distinctes : Hive, Hadoop, Sqoop…PigDataflowlanguage & compilerHiveSQL LikequeriesDSLOozieWorkflow for interdependentHadoop JobsMapReduceFramework permettant de « cruncher » des données en parallèleSqoopIntégration RDBMS & HadoopHbaseBase de données pour des accès aléatoires read/writeZookeeperService de coordinationHDFSUn système de fichiers distribuésWrite-once, readmanyFlume, Chukwa, ScribeCollection de données fiable et résiliente
  • 12.
    HadoopDistributed File SystemUnsystème de fichier distribuéPermet de stocker des fichiers plus volumineux que ce que peut contenir un disque dur…Répartir les données sur plusieurs machines physiquesRépliquer ces données pour assurer le « fail-over » ? N * le volume de donnéescore-site.xmlhdfs-site.xmlmasters, slavesTaille des blocs : dfs.block.size (64MB par défaut)Config. des réplicas (par défaut 3)dfs.replication : le nombre de réplicadfs.replication.min : le nombre de réplica à assurer pour valider une écriture
  • 13.
    MapReduceLe système derequêtage : MapReduceTraiter des volumes de données plus faiblesParalléliser ces traitements « plus » unitairesCo-localiser traitements / donnéesmastersslavescore-site.xmlhdfs-site.xmlmapred-site.xmlhadoop-metrics.propertieslog4j.propertieshadoop-env.sh
  • 14.
  • 15.
    MapReducePrincipe de l’algorithmeObjectif: réaliser la somme des deals sur un axe d’agrégationGEDEQSWAP John 15/09/2010 EUR10200 CreditSGGEDSWAPTION John 14/09/2010 EUR11000 CreditHSBC…GEDSWAPTION John 17/09/2010 EUR 5500 CreditHSBCIRDIRS Simon 13/09/2010 USD10000 DebitSGIRDIRS Simon 14/09/2010 USD11000 CreditBoF(K1, V1)Mapagrégation par deviseEUR 10200USD -10000EUR 11000EUR 5500USD 11000List(K2, V2)Shuffle & SortEUR 10200,11000, 5500USD -10000,11000K2,list(V2)Reducesomme sur l’axe d’agrégationItération sur l’ensemble des K2EUR 26700USD 1000List(K3, V3)
  • 16.
    L’avantage d’un DSLimportorg.apache.hadoop.mapred; public static class MapextendsMapReduceBaseimplements Mapper { public voidmap(LongWritablekey, Text value, OutputCollector output, Reporter reporter) throwsIOException { String line = value.toString(); String[] lineAsArray = line.split("\t"); String currentCurrency = lineAsArray[4]; String amountAsString = lineAsArray[5]; String sens = lineAsArray[6];DoubleWritable data = null; if("Debit".equals(sens)){ data = new DoubleWritable(Double.parseDouble("-" + amountAsString)); }else if("Credit".equals(sens)) { data = new DoubleWritable(Double.parseDouble(amountAsString)); }output.collect(new Text(currentCurrency), data); } }SELECT Currency, SUM(Amount) FROMcash_flowWHERE Direction='Credit' AND DueDate &lt; = unix_timestamp('2010-09-15 00:00:00') GROUP BY Currencypublic class CurrencyAggregateextendsConfiguredimplementsTool {@Overridepublic intrun(String[] args) throws Exception{JobConfconf = new JobConf(CurrencyAggregate.class);conf.setJobName("CurrencyAggregate"); //output of the Mapper );conf.setOutpconf.setOutputKeyClass(Text.classutValueClass(DoubleWritable.class);conf.setMapperClass(Map.class);conf.setReducerClass(Reduce.class);conf.setInputFormat(TextInputFormat.class);conf.setOutputFormat(TextOutputFormat.class);FileInputFormat.setInputPaths(conf, new Path(args[0]));FileOutputFormat.setOutputPath(conf, new Path(args[1]));JobClient.runJob(conf); return 0; }public staticvoid main(String[] args) throws Exception {intexitCode = ToolRunner.run(new CurrencyAggregate(), args);System.exit(exitCode);}/The reduce is called once per key in the output map of the map() function public static class Reduce extends MapReduceBase implements Reducer { public void reduce(Text key, Iterator values, OutputCollector output, Reporter reporter) throws IOException { double sum = 0; while (values.hasNext()) { double amount = values.next().get(); sum += amount; }output.collect(key, new DoubleWritable(sum)); }}
  • 17.
    Hashmap distribuéele modèleAmazon : Dynamo, S3, SimpleDB, Cassandra, Riak, Voldemort…
  • 18.
    Rappelez vous…Objectif :stocker et rechercher dans le web en temps réelObjectif : vendre la plus grande variétéd’articles (livres, bricolage…)Des enjeux communs Performance (malgré les volumétries)Disponibilité (>99,99%)Résilience Scalabilité horizontaleEnjeux : Agréger de gros volumes de données BigTable + Map/ReduceEnjeuxDébit important en écriture tout en assurant la disponibilitéDerniers incidents majeurs : 2004<40 minutes d’indisponibilité par an Dynamo
  • 19.
    Des enjeux différentsde ceux de GoogleUn objectif « simple » : être capable d’accepter une demande d’achat……quelque soit la panne !Enjeux: reporting(induit une modélisation riche), Indisponibilité temporaire acceptableEnjeux: disponibilité en écriture, tolérance à la panneLe modèle RDBMS atteint ces limites en termeDébit en écriture
  • 20.
  • 21.
    Gestion du « capacityplanning » Le modèle RDBMS est adaptéMassivement en lecture
  • 22.
  • 23.
    …Des gènes différents,centrés sur la disponibilité qui imposent des « trade-offs »Trade-off : « weforfeit ‘C’ and ‘I’ for availibility, gracefuldegradation and performance »De ACID vers BASE (WeakConsistency, Best Effort, Stale State…)Un système « élastique »Souplesse du schémaSouplesse de l’infrastructureUn modèle tolérant à la panneRéplication des données entre les serveursMode master / masterUn modèle qui privilégie la disponibilité et propose une gestion fine de la consistance« Eventually Consistent »Un modèle clé/valeur distribuéPermet de répartir le flux de de requêtes
  • 24.
    Hashmap distribuéeModèle dedonnéesModèle de données : une MapCassandra offre un modèle de données « plus riche » en reprenant le modèle « column-oriented » de BigTable : un Map de MapSans aller jusqu’au stockage physique en colonnePropose des index secondaires (v.0.7) : get users where state = 'UT' and birth_date > 1970;
  • 25.
    « Event Sourcing »Le pattern…vision« stock » ou « mouvements »?09/2010 400 Credit13/09/2010 10000 Debit15/09/2010 10200 Credit14/09/2010 11000 Credit15/09/2010 5500 Debit16/09/2010 5500 Debit15/09/2010 11000 Debit16/09/2010 5500 Credit17/09/2010 5500 Credit13/09/2010 10000 Debit15/09/2010 10200 Credit13/09/2010 20000 Debit14/09/2010 11000 Credit15/09/2010 3900 Credit16/09/2010 0 Credit17/09/2010 5500 Credit
  • 26.
    « Event Sourcing »Le pattern…Permetd’adresser des enjeux différentsSource d’évènements, collecteDurable
  • 27.
    Hautement disponible-…Des représentationsadaptées aux usages, restitutionRDBMS
  • 28.
  • 29.
    …Hashmap distribuée PartitionnementLepartitionnement et l’association clé/serveur sont assurés via « consistent hashing »Clientmd5(key) = 3#2«3»
  • 30.
    Hashmap distribuée Gestionde la consistanceConsistance faibleConsistance forteClient(Write)Client(Read)Client(Write)Client(Read)Quorum basedprotocol : N/2 + 1 ou W + R > NTrade off entre consistance, latence, tolérance à la panne en fonction de la donnée#2«3»#2«3»
  • 31.
    Et les « DataGrids »?