Long time without post but not dead blog. Du coup juste un passage rapide avant de reprendre une activité plus dense ici (bientôt j'espère) pour lister quelques outils opensource disponibles sous Github.
Analyser les optimisation JIT de la JVM
https://github.com/AdoptOpenJDK/jitwatch
Analyse des temps de réponse en percentile
https://github.com/giltene/jHiccup
Outil pour insérer de la fragmentation dans le heap afin de tester son application
https://github.com/giltene/HeapFragger
Mesure de la latence
https://github.com/LatencyUtils/LatencyUtils
Mesure des temps de réponse de socket
https://github.com/LatencyUtils/jRT
Ensemble d'outil pour l'analyse du comportement de la jvm
https://github.com/aragozin/jvm-tools
Manipulation des output de jstack pour faciliter l'analyse
https://github.com/lifey/mjprof
PlugIn pour MAT et requeter la Heap
https://github.com/vlsi/mat-calcite-plugin
ItinErrance d'un développeur
mardi 26 septembre 2017
mardi 14 février 2017
Chemin de Maven dependency tree à Neo4j
Histoire de jouer un peu avec la techno, l'objet de ma recherche était de trouver le chemin le plus pour passer de l'output Maven dependency:tree à un joli graph Neo4j (en version 3.0.6).
Premier constat pas de solution directe remontée par google sur des personnes ayant eu la même problématique. Du coup plusieurs approches possibles :
Par soucis d'efficacité pour un besoin plus de l'ordre du tooling je vois ce que je peux faire sans avoir à coder.
"mvn dependency:tree -DoutputType=graphml -DoutputFile=dependency.graphml" (et si besoin j'utilise les -Dincludes et excludes qui vont bien)
A partir de là j'ai mes dépendances dans un fichier Graphml.
Je lance ma console Neo4j (url disponible sous http://localhost:7474/)
Je lance mon shell (sous bin) et tape la ligne de commande qui va bien :
neo4j-sh (?)$ import-graphml -i "file:///c:/My/LocalPath/toMyFile/dependency.graphml" -r DEPENDS_ON -t
Je retourne dans ma console et visualise le graph. Problème malgré l'option -t je perd mes labels et propriétés .... après avoir creusé pas de pistes sérieuses, peut être problème de format du graphml.
Je tente ma chance, récupération d'APOC
CALL apoc.import.graphml("file:///c:/My/LocalPath/toMyFile/dependency.graphml", {batchSize: 10000, readLabels: true, storeNodeIds: true, defaultRelationshipType:"DEPENDSON"});
Cela ne marche pas mieux ... Je tente un export de graph histoire de voir le format (call apoc.export.graphml.all("test",{}) me génère un fichier graphml a la racine de ma base neo4j)
Du coup 3e voie je passe par jEd (https://www.yworks.com/downloads#yEd) pour visualiser mon graph. A voir aussi Gephi (https://gephi.org/)
Quelques commandes de mise en forme :
Je continu à explorer
J'ai un résultat visualisation de mon graph mais pas dans l'outil souhaité. Ce n'est que partie remise et compte bien retourner sur Neo4j qui fait quand même des choses sympa (https://gist.github.com/jexp/90f590ad1d125284bc35223c86bebd33)
Premier constat pas de solution directe remontée par google sur des personnes ayant eu la même problématique. Du coup plusieurs approches possibles :
Je code
- je recode vraiment tout, je récupère un output de mvn dependency tree (Plugin Maven dependency tree) et je parse le resultat (sorti console ou output spécifié au plugin) dans mon langage favori. Une fois que j'ai mon modèle objet je le parcours et l'insère dans Neo4j
- Si Maven dependency peut me sortir un ascii art, c'est du code Java autant réutiliser son tree model
- Je parcours le web et vois ce qui peut m'aider : Aether (https://wiki.eclipse.org/Aether/Transitive_Dependency_Resolution)
Ou maximum de reuse
Par soucis d'efficacité pour un besoin plus de l'ordre du tooling je vois ce que je peux faire sans avoir à coder.
Export côté Maven
Plutôt que réutilisé la sortie console j'utilise le plugin et spécifie on output. Tiens je peux produire du Graphml :"mvn dependency:tree -DoutputType=graphml -DoutputFile=dependency.graphml" (et si besoin j'utilise les -Dincludes et excludes qui vont bien)
A partir de là j'ai mes dépendances dans un fichier Graphml.
Import côté Neo4j
Je lance ma console Neo4j (url disponible sous http://localhost:7474/)
- Voir le résultat de mon import : MATCH (n) RETURN n;
- Tout effacer pour recommencer : MATCH (n), ()-[r]-() DELETE n,r
- Ou encore pour partir d'une base vide avant de lancer ma base effacer le contenu de \data\databases\
Import via neo4j-shell
Je lance mon shell (sous bin) et tape la ligne de commande qui va bien :
neo4j-sh (?)$ import-graphml -i "file:///c:/My/LocalPath/toMyFile/dependency.graphml" -r DEPENDS_ON -t
Je retourne dans ma console et visualise le graph. Problème malgré l'option -t je perd mes labels et propriétés .... après avoir creusé pas de pistes sérieuses, peut être problème de format du graphml.
Import via APOC
Je tente ma chance, récupération d'APOC
- download : https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/tag/3.0.4.2
- je le place dans le répertoire plugin de mon Neo4j
- je modifie ma configuration neo4j pour ajouter les 2 propriétées suivante
- apoc.export.file.enabled=true
- apoc.import.file.enabled=true
- je démarre mon neo4j et teste : call apoc.help("apoc")
CALL apoc.import.graphml("file:///c:/My/LocalPath/toMyFile/dependency.graphml", {batchSize: 10000, readLabels: true, storeNodeIds: true, defaultRelationshipType:"DEPENDSON"});
Cela ne marche pas mieux ... Je tente un export de graph histoire de voir le format (call apoc.export.graphml.all("test",{}) me génère un fichier graphml a la racine de ma base neo4j)
On fait quoi ....
Je reste sur ma ligne on a dit sans code ....
Du coup 3e voie je passe par jEd (https://www.yworks.com/downloads#yEd) pour visualiser mon graph. A voir aussi Gephi (https://gephi.org/)
Quelques commandes de mise en forme :
- Open Document -> dependency.graphml > OK.
- Tools > Fit Note to Label … > OK
- Layout > Hierarchical > Orientation > Left to Right > OK
Quand j'aurais le temps de coder
Je continu à explorer
- neo4j-shell (https://github.com/jexp/neo4j-shell-tools#graphml-import)
- APOC
- Maven dependency plugin (ses tests unitaires sont un bon point d'entré)
- Aether
- https://github.com/finn-no/maven-dependency-mapper
- https://github.com/jcaddel/graph-maven-plugin
Conclusion
J'ai un résultat visualisation de mon graph mais pas dans l'outil souhaité. Ce n'est que partie remise et compte bien retourner sur Neo4j qui fait quand même des choses sympa (https://gist.github.com/jexp/90f590ad1d125284bc35223c86bebd33)
mardi 12 juillet 2016
Tech use case Neo4j
Tout d'abord une petite introduction car cela fait un petit moment que je n'ai pas pris ma plume numérique pour gratter quelques mots sur ce blog .... le grand problème des temps modernes : le temps.
Du coup ce retour n'est pas pour un long article mais pour y inscrire quelques références et laisser une trace dans le temps d'une utilisation qui me semble intéressante de Neo4j (oui oui, toujours java, jvm, datastorage, ... cela n'a pas changé). Ce qui me permettra d'y revenir pour creuser plus en avant ces pistes si l'occasion se présente.
Pour avancer en runtime des profiler proposent des vues sur le contenu, en statique via heapdump une photo qui peut être analysée (jdk tool, MAT, ...). Soit mais la console Neo4j est quand même bien jolie et Cypher plutôt sympa comme langage à utiliser, du coup je me dis qu'il y a bien quelqu'un qui a travaillé sur le sujet.
Différente utilisation en analyse de code, repo maven, ... :
http://neo4j-contrib.github.io/asciidoc-slides/content/presentation/software_analytics/software_analytics.html
Analyser un java heap avec Neo4J
https://www.infoq.com/presentations/neo4j-java-heap-analysis
https://speakerdeck.com/npryce/looking-for-smoking-guns-in-a-haystack-jvm-heap-analysis-with-neo4j
En complément :
Génération d'un heapdump en programmatique
https://github.com/neo4j/neo4j/tree/6280974efc9b082d5f40044df362355134a8632b/community/kernel/src/test/java/org/neo4j/test/rule/dump
https://searchcode.com/codesearch/view/71592610/
Quand on ne le fait pas en Cypher, on peut le faire en OQL (Object Query Language)
https://visualvm.java.net/oqlhelp.html
Un HPROF c'est écrit comment
https://blogs.oracle.com/kto/entry/the_hprof_manual
https://blogs.oracle.com/kto/resource/manual.html
https://java.net/downloads/heap-snapshot/hprof-binary-format.html
Projet de parsing d'HPROF
https://github.com/eaftan/hprof-parser
Voilà, voilà avec tout cela on doit pouvoir générer un heapdump, le parser, insérer le graph dans Neo4j afin qu'il soit à disposition pour être requêter en Cypher ... ya plus qu'à .... avec un peu de temps.
2e cas qui peut être sympa, parsing du code (antlr, ...) et représentation des dépendances en vision statique code écris.
https://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/3659/CON7557_Remani-bigdata-javaone.pdf
Comparatif des solutions de streaming
http://fr.slideshare.net/GyulaFra/largescale-stream-processing-in-the-hadoop-ecosystem-hadoop-summit-2016-60887821
Perspective ecosystem Hadoop et une photo du premier Hadoop, l'éléphant peluche
http://fr.slideshare.net/cloudera/apache-hadoop-at-10-59397028
Du coup ce retour n'est pas pour un long article mais pour y inscrire quelques références et laisser une trace dans le temps d'une utilisation qui me semble intéressante de Neo4j (oui oui, toujours java, jvm, datastorage, ... cela n'a pas changé). Ce qui me permettra d'y revenir pour creuser plus en avant ces pistes si l'occasion se présente.
Neo4j pour une utilisation côté développeur
C'est parti d'une réflexion simple lors d'une soirée discussion développeur : quand je veux analyser mon heap java, c'est un graph d'objet (avec ses dominators, ....).Pour avancer en runtime des profiler proposent des vues sur le contenu, en statique via heapdump une photo qui peut être analysée (jdk tool, MAT, ...). Soit mais la console Neo4j est quand même bien jolie et Cypher plutôt sympa comme langage à utiliser, du coup je me dis qu'il y a bien quelqu'un qui a travaillé sur le sujet.
Différente utilisation en analyse de code, repo maven, ... :
http://neo4j-contrib.github.io/asciidoc-slides/content/presentation/software_analytics/software_analytics.html
Analyser un java heap avec Neo4J
https://www.infoq.com/presentations/neo4j-java-heap-analysis
https://speakerdeck.com/npryce/looking-for-smoking-guns-in-a-haystack-jvm-heap-analysis-with-neo4j
En complément :
Génération d'un heapdump en programmatique
https://github.com/neo4j/neo4j/tree/6280974efc9b082d5f40044df362355134a8632b/community/kernel/src/test/java/org/neo4j/test/rule/dump
https://searchcode.com/codesearch/view/71592610/
Quand on ne le fait pas en Cypher, on peut le faire en OQL (Object Query Language)
https://visualvm.java.net/oqlhelp.html
Un HPROF c'est écrit comment
https://blogs.oracle.com/kto/entry/the_hprof_manual
https://blogs.oracle.com/kto/resource/manual.html
https://java.net/downloads/heap-snapshot/hprof-binary-format.html
Projet de parsing d'HPROF
https://github.com/eaftan/hprof-parser
Voilà, voilà avec tout cela on doit pouvoir générer un heapdump, le parser, insérer le graph dans Neo4j afin qu'il soit à disposition pour être requêter en Cypher ... ya plus qu'à .... avec un peu de temps.
2e cas qui peut être sympa, parsing du code (antlr, ...) et représentation des dépendances en vision statique code écris.
Et en dehors de Neo4j
Une histoire des datastorage du file system au NoSQLhttps://published-rs.lanyonevents.com/published/oracleus2015/sessionsFiles/3659/CON7557_Remani-bigdata-javaone.pdf
Comparatif des solutions de streaming
http://fr.slideshare.net/GyulaFra/largescale-stream-processing-in-the-hadoop-ecosystem-hadoop-summit-2016-60887821
Perspective ecosystem Hadoop et une photo du premier Hadoop, l'éléphant peluche
http://fr.slideshare.net/cloudera/apache-hadoop-at-10-59397028
dimanche 29 mars 2015
Quelques pointeurs NoSQL
Post rapide pour présenter quelques urls
Liste assez complète de base NoSQL et plus
http://nosql-database.org/
Ce site en lien avec les NoSql matters, conférences dédiées au NoSQL dont une s'est déroulé le 26 et 27 mars dernier à Paris, pour vous faire une idée du programme
Une série d'article sur le NoSQL : de l'histoire à quels critères de sélection :
Pour finir un blog très bien fait avec un article présentant les familles NoSQL
https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/
Liste assez complète de base NoSQL et plus
http://nosql-database.org/
Ce site en lien avec les NoSql matters, conférences dédiées au NoSQL dont une s'est déroulé le 26 et 27 mars dernier à Paris, pour vous faire une idée du programme
Une série d'article sur le NoSQL : de l'histoire à quels critères de sélection :
- http://www.3pillarglobal.com/insights/short-history-databases-rdbms-nosql-beyond
- http://www.3pillarglobal.com/insights/just-say-yes-to-nosql
- http://www.3pillarglobal.com/insights/exploring-the-different-types-of-nosql-databases
- http://www.3pillarglobal.com/insights/selection-criteria-for-nosql-database
Pour finir un blog très bien fait avec un article présentant les familles NoSQL
https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/
NoSQL ok, mais OLAP ?
Le NoSQL a le vent en poupe. Les bases de ces frameworks développés au début des années 2000 (2000, 2010) par les géants du web (Google, Facebook, Amazon, ...) pour répondre à leurs besoins croissants de gestion de volume de données en constante augmentation avec des temps de réponse de l'ordre de l'instantané tout en assurant la disponibilité via redondance de l'information.
L'idée était de disposer de datastorages réactifs en abandonnant un certain nombre de contraintes (voir CAP théorème, encore appelé théorème de Brewer), ce que ne permettaient pas les bases de données classiques (Oracle, Sysbase and Co)
Aujourd'hui ces frameworks ou leurs principes sont repris par les communautés de développeurs et font régulièrement l'objet de présentations, article blog, ...
Au milieu de tout ce mouvement NoSQL, un autre principe qui fait moins l'actualité mais reste très présent dans la catégorie datastorage : OLAP.
Oracle, SAP, Microsoft, ... ont dans leurs gammes de produits entreprise tous une brique OLAP, restant un produit. Les communautés de développeurs ne se sont pas encore emparé du sujet mais on l’aperçoit de temps en temps.
OLAP c'est quoi
L'acronyme OLAP signifie OnLine Analytical Processing.
On le défini souvent par opposition à l'OLTP (Online Transaction Processing). Il se veut un outil permettant facilement d'analyser un important volume de données. Cela tombe bien on est en période BigData.
Définition wikipédia :
- OLAP : http://en.wikipedia.org/wiki/Online_analytical_processing
- OLTP : http://en.wikipedia.org/wiki/Online_transaction_processing
La encore ce n'est pas quelque chose de récent, si l'on creuse un peu l'histoire on tombera sur Edgar F. Codd et les 12 règles de Codd (1993) :
- Codd : http://en.wikipedia.org/wiki/Edgar_F._Codd
- Un papier à l'origine : "Providing OLAP to User-Analysts: An IT Mandate" http://www.minet.uni-jena.de/dbis/lehre/ss2005/sem_dwh/lit/Cod93.pdf
Puis un langage de Microsoft en 1997 le MultiDimensional eXpressions permettant de requeter un produit OLAP, c'est devenu un standard dans le monde OLAP.
- MDX : http://en.wikipedia.org/wiki/MultiDimensional_eXpressions
- Mosha Pasumansky ingénieur ayant travaillé sur le sujet : http://en.wikipedia.org/wiki/Mosha_Pasumansky
Olap et le monde Java
Il y a eu un premier essai qui n'a pas abouti qui s'est traduit par une JSR commencé en 2000 et abandonnée officiellement en 2012 n'ayant pas évolué depuis 2004 : JOLAP, JSR 69
https://jcp.org/en/jsr/detail?id=69
Quelques uns ont persisté et Java possède une librairie (toujours active) de querying : Olap4j
En lien avec le projet open source Mondrian qui lui propose la partie serveur OLAP
Olap dans la tendance actuelle
Même si on le rencontre peu, un des intérêts d'Olap arrive là où les framework NoSQL ont quelques manques : l'aspect agrégation des données et représentation permettant d'en tirer du sens (le fameux analytics).Une combinaison que l'on peut imaginer est un datastorage massif avec redondance en NoSQL sur lequel s'appuie un frontal intermédiaire type Olap.
Deux projets adoptant cette approche :
EBay avec Kylin (Olap) s'appuyant sur du Haddop :
- http://www.kylin.io/
- http://www.ebaytechblog.com/2014/10/20/announcing-kylin-extreme-olap-engine-for-big-data/
Un projet GitHub Doradus appuyant une couche Olap sur une couche Cassandra :
https://github.com/dell-oss/Doradus/wiki/Architecture%20%28OLAP%29
Adobe s'est également intéressé au Olap en s'appuyant sur du HBase (datastorage derrière Hadoop)
dimanche 15 mars 2015
Quelques mots sur Cassandra
Ayant récemment un peu creusé la technologie et sans faire redite avec un post précédent quelques points concernant Cassandra.
Dans la mouvance NoSQL (lire dans le texte NotOnlySQL), structure de stockage de données développée en Java entrant dans la catégorie hybride clé/valeur clé/colonne. Cassandra prend place dans le triangle du CAP théorème (autrement nommé théorème de Brewer) proposant à l'utilisateur de régler le niveau de réplication et le niveau de cohérence via paramètres et ce fonction de ses besoins.
Le home du projet : http://cassandra.apache.org/
Vous les trouverez régulièrement pas très loin : Datastax. Société qui propose une surcouche à Cassandra, orienté "entreprise". Ils possèdent une forte expertise sur Cassandra, comptant dans leur rang un certain nombre de committers Cassandra. Leur surcouche permet (entre autres) de faire le lien entre le storage Cassandra et de l'analytics comme Spark ou encore recherche/indexation avec Solr. Ils viennent récemment de s'attaquer aux graph db en faisant l'acquisition de Aurelius (TitanDb).
Les communiqués de presse :
Côté Datastax : http://www.datastax.com/2015/02/datastax-acquires-aurelius-the-experts-behind-titandb
Côté Aurelius : http://thinkaurelius.com/2015/02/03/aurelius-acquired-by-datastax/
Home de TitanDB : http://thinkaurelius.github.io/titan/
Le home de Datastax : http://www.datastax.com/what-we-offer/products-services/datastax-enterprise
Les outils qui vont bien (très orienté DataStax, il doit exister d'autres) :
CCM (Cassandra Cluster Manager), outil de développement réalisé par Sylvain Lebresne (DataStax). Non recommandé en production, il permet en local de gérer un cluster avec plusieurs noeuds Cassandra. Très bien pour se faire la main et commencer à jouer avec la technologie.
Home CCM : https://github.com/pcmanus/ccm
How to CCM : http://planetcassandra.org/getting-started-with-ccm-cassandra-cluster-manager/
Article : http://www.datastax.com/dev/blog/ccm-a-development-tool-for-creating-local-cassandra-clusters
DevCenter, outil de Datastax qui permet de bénéficier d'une GUI pour s'interfacer avec un Cassandra déployé. Permet de requêter, voir les traces d'exécution, visualiser les tables de vos namespaces et les tables systèmes.
DevCenter : http://www.datastax.com/what-we-offer/products-services/devcenter
OpsCenter, outils de DataStax également qui nous fait entrer plus du côté administrateur pour visualiser nos clusters, noeuds Cassandra.
OpsCenter : http://www.datastax.com/what-we-offer/products-services/datastax-opscenter
Enfin pour coder son client Java qui vient requêter le datastore Cassandra au travers un noeud qui devient coordinateur : le Java driver Datastax
Home Java Driver (avec la dependency Maven qui va bien) : https://github.com/datastax/java-driver
Cassandra étant en Java bien entendu toutes les JConsole, VisualVM & co sont les bienvenues pour suivre ce qu'il se passe.
Cassandra trouve à sa source deux projets le précédent BigTable de Google (2006) auquel Cassandra empruntera le modèle de données structuré ColumnFamily. Et Dynamo d'Amazon (2007) auquel Cassandra reprend le partitionning et le système de réplication.
Ces deux projets ont fait l'objet de publication technique :
Cassandra est développé au sein de Facebook par Avinash Lakshman (un des créateur de Dynamo d'Amazon) et Prashant Malik (ingénieur Facebook). Il sera open sourcé par Facebook en 2008.
A propos du key value store vs column family : http://www.edwardcapriolo.com/roller/edwardcapriolo/entry/on_key_value_vs_column
Généralités sur l'architecture : http://wiki.apache.org/cassandra/ArchitectureOverview
OnHeap, offHeap : Cassandra (en java donc dans une jvm) utilise du off heap pour stocker un certain nombre d'information : http://noflex.org/cassandra-component-on-heap-or-off-heap/
Composants techniques au cœur de Cassandra : MemTable et SSTable
A connaitre pour bien comprendre le fonctionnement : Read Path et Write Path
http://fr.slideshare.net/joshmckenzie/cassandra-21-read-write-path
Requête sur une base Cassandra :
CQL : https://cassandra.apache.org/doc/cql3/CQL.html
Avant le CQL, le shell (qui viendrait à disparaitre) : http://wiki.apache.org/cassandra/CassandraCli
Enfin quelques drivers permettant d'attaquer Cassandra dans différents langages : http://planetcassandra.org/client-drivers-tools/
Au coeur du principe distribué de Cassandra et ce qui en fait un système sans SPOF (Single Point Of Failure) : le Gossip protocole
Filtre de Bloom
Merkle tree, pour vérifier la consistance et permettre la remonté rapide de nœud :
Paxos pour les transactions dites légère
Pour finir quelques utilisateurs de Cassandra en production sans gâcher la surprise quelques noms connus : CERN, eBay, GitHub, Instagram, Intuit, Netflix, Reddit, The Weather Channel, ...
Pour plus de détails :
Utilisateurs de Cassandra : http://planetcassandra.org/companies/
L'exemple de Netflix (presentation 2012) : http://fr.slideshare.net/acunu/cassandra-eu-2012-netflixs-cassandra-architecture-and-open-source-efforts
Blog technique netflix : http://techblog.netflix.com/search/label/Cassandra
En guise de conclusion, trois points qui me semblent importants à réfléchir pour passer un projet sur Cassandra :
Quelques éléments de réflexion chez les géants du web :
Cassandra
Dans la mouvance NoSQL (lire dans le texte NotOnlySQL), structure de stockage de données développée en Java entrant dans la catégorie hybride clé/valeur clé/colonne. Cassandra prend place dans le triangle du CAP théorème (autrement nommé théorème de Brewer) proposant à l'utilisateur de régler le niveau de réplication et le niveau de cohérence via paramètres et ce fonction de ses besoins.
Le home du projet : http://cassandra.apache.org/
Vous les trouverez régulièrement pas très loin : Datastax. Société qui propose une surcouche à Cassandra, orienté "entreprise". Ils possèdent une forte expertise sur Cassandra, comptant dans leur rang un certain nombre de committers Cassandra. Leur surcouche permet (entre autres) de faire le lien entre le storage Cassandra et de l'analytics comme Spark ou encore recherche/indexation avec Solr. Ils viennent récemment de s'attaquer aux graph db en faisant l'acquisition de Aurelius (TitanDb).
Les communiqués de presse :
Côté Datastax : http://www.datastax.com/2015/02/datastax-acquires-aurelius-the-experts-behind-titandb
Côté Aurelius : http://thinkaurelius.com/2015/02/03/aurelius-acquired-by-datastax/
Home de TitanDB : http://thinkaurelius.github.io/titan/
Le home de Datastax : http://www.datastax.com/what-we-offer/products-services/datastax-enterprise
Les outils pour travailler avec Cassandra
Les outils qui vont bien (très orienté DataStax, il doit exister d'autres) :
CCM (Cassandra Cluster Manager), outil de développement réalisé par Sylvain Lebresne (DataStax). Non recommandé en production, il permet en local de gérer un cluster avec plusieurs noeuds Cassandra. Très bien pour se faire la main et commencer à jouer avec la technologie.
Home CCM : https://github.com/pcmanus/ccm
How to CCM : http://planetcassandra.org/getting-started-with-ccm-cassandra-cluster-manager/
Article : http://www.datastax.com/dev/blog/ccm-a-development-tool-for-creating-local-cassandra-clusters
DevCenter, outil de Datastax qui permet de bénéficier d'une GUI pour s'interfacer avec un Cassandra déployé. Permet de requêter, voir les traces d'exécution, visualiser les tables de vos namespaces et les tables systèmes.
DevCenter : http://www.datastax.com/what-we-offer/products-services/devcenter
OpsCenter, outils de DataStax également qui nous fait entrer plus du côté administrateur pour visualiser nos clusters, noeuds Cassandra.
OpsCenter : http://www.datastax.com/what-we-offer/products-services/datastax-opscenter
Enfin pour coder son client Java qui vient requêter le datastore Cassandra au travers un noeud qui devient coordinateur : le Java driver Datastax
Home Java Driver (avec la dependency Maven qui va bien) : https://github.com/datastax/java-driver
Cassandra étant en Java bien entendu toutes les JConsole, VisualVM & co sont les bienvenues pour suivre ce qu'il se passe.
Un peu d'histoire
Cassandra trouve à sa source deux projets le précédent BigTable de Google (2006) auquel Cassandra empruntera le modèle de données structuré ColumnFamily. Et Dynamo d'Amazon (2007) auquel Cassandra reprend le partitionning et le système de réplication.
Ces deux projets ont fait l'objet de publication technique :
- Bigtable: A Distributed Storage System for Structured Data
- Dynamo: Amazon’s Highly Available Key-value Store
Cassandra est développé au sein de Facebook par Avinash Lakshman (un des créateur de Dynamo d'Amazon) et Prashant Malik (ingénieur Facebook). Il sera open sourcé par Facebook en 2008.
A propos du key value store vs column family : http://www.edwardcapriolo.com/roller/edwardcapriolo/entry/on_key_value_vs_column
Quelques mots clé (pour approfondir via google & co)
Généralités sur l'architecture : http://wiki.apache.org/cassandra/ArchitectureOverview
OnHeap, offHeap : Cassandra (en java donc dans une jvm) utilise du off heap pour stocker un certain nombre d'information : http://noflex.org/cassandra-component-on-heap-or-off-heap/
Composants techniques au cœur de Cassandra : MemTable et SSTable
A connaitre pour bien comprendre le fonctionnement : Read Path et Write Path
http://fr.slideshare.net/joshmckenzie/cassandra-21-read-write-path
Requête sur une base Cassandra :
CQL : https://cassandra.apache.org/doc/cql3/CQL.html
Avant le CQL, le shell (qui viendrait à disparaitre) : http://wiki.apache.org/cassandra/CassandraCli
Enfin quelques drivers permettant d'attaquer Cassandra dans différents langages : http://planetcassandra.org/client-drivers-tools/
Quelques Algo derrière cette belle machine
Au coeur du principe distribué de Cassandra et ce qui en fait un système sans SPOF (Single Point Of Failure) : le Gossip protocole
- http://en.wikipedia.org/wiki/Gossip_protocol
- http://highscalability.com/blog/2011/11/14/using-gossip-protocols-for-failure-detection-monitoring-mess.html
- http://www.datastax.com/documentation/cassandra/2.0/cassandra/architecture/architectureGossipAbout_c.html
Filtre de Bloom
- http://en.wikipedia.org/wiki/Bloom_filter
- http://spyced.blogspot.fr/2009/01/all-you-ever-wanted-to-know-about.html
- http://billmill.org/bloomfilter-tutorial/
Merkle tree, pour vérifier la consistance et permettre la remonté rapide de nœud :
- http://en.wikipedia.org/wiki/Merkle_tree
- http://wiki.apache.org/cassandra/AntiEntropy
- http://distributeddatastore.blogspot.fr/2013/07/cassandra-using-merkle-trees-to-detect.html
- http://stackoverflow.com/questions/5486304/explain-merkle-trees-for-use-in-eventual-consistency
Paxos pour les transactions dites légère
- http://en.wikipedia.org/wiki/Paxos_%28computer_science%29
- https://www.youtube.com/watch?v=WX4gjowx45E
- http://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0
- http://www.vldb.org/pvldb/vol4/p243-rao.pdf
Dans la vie réelle
Pour finir quelques utilisateurs de Cassandra en production sans gâcher la surprise quelques noms connus : CERN, eBay, GitHub, Instagram, Intuit, Netflix, Reddit, The Weather Channel, ...
Pour plus de détails :
Utilisateurs de Cassandra : http://planetcassandra.org/companies/
L'exemple de Netflix (presentation 2012) : http://fr.slideshare.net/acunu/cassandra-eu-2012-netflixs-cassandra-architecture-and-open-source-efforts
Blog technique netflix : http://techblog.netflix.com/search/label/Cassandra
Conclusion
En guise de conclusion, trois points qui me semblent importants à réfléchir pour passer un projet sur Cassandra :
- J'ai mon storage de donnée mais comment je mets en place mon moteur d'agrégation (Datastax avec sa surcouche propose quelques solutions).
- Le schéma de mon stockage dans Cassandra est très fortement impacté par comment je vais requêter, il faut avoir une idée de ce que l'on veut avant de partir (contrairement à des datastorage plus souple comme MongoDB, orienté document).
- Une fois dedans, quelles portes de sorties. Par exemple comment je back up sur un autre support mes données qui sont dans les noeuds Cassandra ... un réponse peut être pas besoin, la solution comme cela me va mais à ce moment attention aux migrations.
Quelques éléments de réflexion chez les géants du web :
dimanche 2 novembre 2014
Un jour, un storage : Redis
Une autre structure de stockage de données in memory dont on entend régulièrement parler : Redis.
Je l'ai rencontré lors d'une conférence au Devoxx Paris 2014 suite à une présentation "Tools in action" de Nicolas Martignole "Redis, une base Not Only NoSQL" :
Redis signifie "REmote DIctionary Server" avec un jeu de mot sur Redistribute (http://redis.io/topics/faq)
Si l'on retient les classifications actuelles, on pourrait la qualifier de base NoSQL clé/valeur. C'est une base in memory qui communique en TCP. Elle est écrite en C ANSI et tourne sur la majeur partie des systèmes dit POSIX, Linux est recommandé (http://redis.io/topics/introduction) mais il existe un portage windows https://github.com/MSOpenTech/redis.
Afin de pouvoir requêter cette base de nombreux de clients ont été développés dans différents langages (Java, C, C#, Go Perl, Haskell, Lua, ...).
Redis, construit sur la base d'un manifeste, lettre d'intention sur ce qu'il doit être, a une approche qui colle aux structures de données manipulées. Pour preuve son API et la documentation qui donne le Time Complexity (en notation O) des différents points d'API :
Quand aux utilisations possibles : cache dynamique, base in memory (persistence possible en dump ou journalisation), messaging. Attention à vos contraintes et au CAP théorème.
Redis a été créé par Salvatore Sanfilippo et Pieter Noordhuis en 2009 (voir http://redis.io/topics/license).
Avant Mai 2013 le projet était sponsorisé par VMWare, il l'est maintenant par Pivotal.
La version actuelle est la 2.8.17, une version 3.0.0 est en release candidate. L'historique des versions depuis 2009 est accessible via Google Code
Redis est utilisé par quelques grands noms du web :
Et la concurrence ... Redis est régulièrement comparé à memcached
Le Site : http://redis.io/
Sous GitHub : https://github.com/antirez/redis
Les download : http://redis.io/download
Benchmarks : http://redis.io/topics/benchmarks
Du côté des développeurs :
Pour contribuer à Redis : http://redis.io/community
La mailing : https://groups.google.com/forum/#!forum/redis-db
Pour finir quelques tutoriaux pour s'y essayer :
Je l'ai rencontré lors d'une conférence au Devoxx Paris 2014 suite à une présentation "Tools in action" de Nicolas Martignole "Redis, une base Not Only NoSQL" :
- La présentation Parleys : https://www.parleys.com/play/535e4ed8e4b03397a8eee8d4/chapter0/about
- Les slides : https://speakerdeck.com/nicmarti/redis-une-base-not-only-nosql
- Article sur le blog de Nicolas : http://www.touilleur-express.fr/2013/04/03/redis/
Redis c'est quoi
Redis signifie "REmote DIctionary Server" avec un jeu de mot sur Redistribute (http://redis.io/topics/faq)
Si l'on retient les classifications actuelles, on pourrait la qualifier de base NoSQL clé/valeur. C'est une base in memory qui communique en TCP. Elle est écrite en C ANSI et tourne sur la majeur partie des systèmes dit POSIX, Linux est recommandé (http://redis.io/topics/introduction) mais il existe un portage windows https://github.com/MSOpenTech/redis.
Afin de pouvoir requêter cette base de nombreux de clients ont été développés dans différents langages (Java, C, C#, Go Perl, Haskell, Lua, ...).
- Liste des clients : http://redis.io/clients
- Jedis : https://github.com/xetorthio/jedis
- Redisson : https://github.com/mrniko/redisson
- JRedis : https://github.com/alphazero/jredis
Redis, construit sur la base d'un manifeste, lettre d'intention sur ce qu'il doit être, a une approche qui colle aux structures de données manipulées. Pour preuve son API et la documentation qui donne le Time Complexity (en notation O) des différents points d'API :
- Le manifeste : http://oldblog.antirez.com/post/redis-manifesto.html
- Exemple dans la documentation : http://redis.io/commands/getset
Quand aux utilisations possibles : cache dynamique, base in memory (persistence possible en dump ou journalisation), messaging. Attention à vos contraintes et au CAP théorème.
L'historique
Redis a été créé par Salvatore Sanfilippo et Pieter Noordhuis en 2009 (voir http://redis.io/topics/license).
Avant Mai 2013 le projet était sponsorisé par VMWare, il l'est maintenant par Pivotal.
La version actuelle est la 2.8.17, une version 3.0.0 est en release candidate. L'historique des versions depuis 2009 est accessible via Google Code
Redis est utilisé par quelques grands noms du web :
- http://redis.io/topics/whos-using-redis (github, twitter, ...)
- https://github.com/blog/530-how-we-made-github-fast
Et la concurrence ... Redis est régulièrement comparé à memcached
- http://www.javaworld.com/article/2836878/developer-tools-ide/why-redis-beats-memcached-for-caching.html
- http://www.infoq.com/news/2011/09/java-memcached-rise
Les URLS
Le Site : http://redis.io/
Sous GitHub : https://github.com/antirez/redis
Les download : http://redis.io/download
Benchmarks : http://redis.io/topics/benchmarks
Du côté des développeurs :
- Site de Salvatore Sanfilippo (aka Antirez) : http://invece.org/
- Blog d'Antirez : http://antirez.com/latest/0
- GitHub de Pieter Noordhuis : https://github.com/pietern
Participer aux développements
Pour contribuer à Redis : http://redis.io/community
La mailing : https://groups.google.com/forum/#!forum/redis-db
Pour finir quelques tutoriaux pour s'y essayer :
Inscription à :
Articles (Atom)