Upload
nadia-metoui
View
217
Download
0
Embed Size (px)
Citation preview
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 1/22
Julien Gerlier
Siman Chen
Prototypage et évaluation deperformances d’un service de traçabilité
avec une architecture distribuée basée
sur Hadoop
Rapport de projet de fin d’étude
ASR 2010/2011
Encadrants :
- Bruno Defude (TMSP),
- Elisabeth Brunet (TMSP),
- Amin Sakka (Novapost)
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 2/22
SommaireSommaire ............................................................................................................................. 2
Introduction ......................................................................................................................... 3
I. Présentation du projet ...................................................................................................... 4
a) Contexte ................................................................................................................ 4
b) Objectifs ................................................................................................................ 4
c) Technologies choisies ............................................................................................ 5
d) Travail à effectuer .................................................................................................. 5
II. Cassandra ......................................................................................................................... 6
a) Introduction........................................................................................................... 6
b) La structure de données........................................................................................ 6
c) Les avantages ...................................................................................................... 10
d) Les limites ............................................................................................................ 10
III. Hadoop et HDFS ............................................................................................................ 10
a) Introduction......................................................................................................... 10
b) Conception et déploiement d’un système de fichiers distribué ......................... 11
c) Prévention des échecs d’écriture ........................................................................ 12
d) Paramètres de performances .............................................................................. 12
e) MapReduce ......................................................................................................... 13
IV. Mise en place du prototype et tests ............................................................................. 14
a) Environnement de travail .................................................................................... 14
b) Conception de la base de données ..................................................................... 14
c) Insertion massive dans la base ............................................................................ 16
d) Couplage Hadoop / Cassandra ............................................................................ 18
e) HBase................................................................................................................... 19
V. Difficultés rencontrées ................................................................................................... 20
a) Manque de documentation ................................................................................ 20
b) Matériel trop peu puissant .................................................................................. 20
Conclusion .......................................................................................................................... 21
a) Conclusion personnelle ....................................................................................... 21
b) Estimation du temps de travail ........................................................................... 21
Références ......................................................................................................................... 22
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 3/22
Introduction
Le cloud computing est un concept apparu récemment, mais de plus en plus à la
mode dans le secteur de l’informatique. Littéralement "l'informatique dans les
nuages", il consiste pour les entreprises à externaliser et distribuer les ressources
numériques qu'elles stockent, c’est-à-dire l'utilisation de la mémoire et des
performances des ordinateurs, avec des serveurs répartis dans le monde entier liés
par un réseau, tel Internet. Les utilisateurs du nuage pourraient ainsi disposer d'une
puissance informatique considérable et modulable.
Novapost est une entreprise qui propose un services de dématérialisation de
documents à valeur légales, comme des feuilles de paie par exemple, qui sont
stockés sous forme numérique et suivi par un service de traçage qui enregistre les
moindres opérations effectuées sur ces fiches afin de maintenir leur valeur légale.
Pour l’instant le service de Novapost repose sur une architecture client/ser veur
classique mais suite au nombre croissant de client, ils envisagent de totalement
distribuer leur architecture.
Notre projet de fin d’étude a pour but d’étudier les méthodes et technologiespermettant réaliser la nouvelle architecture répartie.
Nous nous intéresserons particulièrement aux technologies Cassandra, Système de
Gestion de Base de Données (SGBD) NoSQL, et Hadoop, framework Java destiné aux
applications distribuées et à la gestion intensive des données. Ce sont des
technologies récentes, encore relativement peu connues du grand public mais
auxquelles on associe déjà des grands noms parmi lesquels : Facebook, Yahoo ou
encore Twitter.
Ce présent rapport se divisera en cinq grandes parties. Dans un premier temps, nous
allons présenter de manière détaillée notre les objectifs du projet et les étapesenvisagées au départ. Puis, les deuxième et troisième parties porteront sur
respectivement nos études de Cassandra et d’Hadoop, les deux technologies clés de
notre projet. La partie suivante explicitera les différents tests et développement que
nous avons effectués. Enfin, nous parlerons dans une dernière partie des difficultés
que nous rencontrées et des bilans que nous en avons tirés.
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 4/22
I. Présentation du projet
a) Contexte
Novapost est une entreprise qui propose à d’autres entreprises un service dedématérialisation de leur processus de gestion documentaire, un exemple : la
gestion des fiches de paie.
Dans le monde de la dématérialisation, les exigences sur la traçabilité des documents
sont très importantes. En effet, la dématérialisation des processus et des documents
s’inscrit dans un cadre législatif rigoureux, on doit tenir compte de la criticité des
documents à gérer, et assurer leur pérennité ainsi que confidentialité. D’où le besoin
pour un service décrivant les opérations effectuées sur les documents par les
différents systèmes et acteurs intervenant dans la chaine de traitement de ce
dernier.
Pour cela, Novapost a mis en place un service de traçabilité appelé « LX Track » :
c’est un service qui permet de centraliser les traces des opérations effectués sur les
documents afin d’assurer leur valeur probante.
Ce service est constitué d’un client web qui interroge le service de traçage,
l’ensemble des fichiers de trace étant indexés par une base SQL.
b) Objectifs
L’une des priorités de Novapost est la performance : chaque service Novapost est
développé pour être opéré dans un contexte de haute disponibilité, avec une
capacité de traitement industriel. Un tel service doit supporter de brusque montée
en charge sur des équipements standards (quand tout le monde consulte sa feuillede paie à la fin du mois par exemple). Or, le service actuel utilise une base de
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 5/22
données MySQL classique qui supporte de plus en plus mal ces montées en charge et
ne sera bientôt plus adaptée en raison du nombre croissant de connexion et de
fichiers à stocker.
Pour cette raison, nous souhaitons rendre l’architecture de ce service totalement
réparti. Ceci nécessite l’utilisation d’un système de stockage distribué.
c) Technologies choisies
Pour l’indexation des fichiers de traces, Novapost souhaite migrer le modèle
relationnel actuel vers un model NoSQL (« Not Only SQL ») distribué pour assurer
une évolutivité transversale du service.
Parmi les nombreuses solutions NoSQL, Amin Sakka qui est notre contact chez
Novapost nous a conseillé Cassandra, une SGBD (Système de gestion de base dedonnées) NoSQL développé par la fondation Apache. Cassandra est conçue pour
gérer des quantités massives de données réparties sur plusieurs serveurs (cluster),
en assurant tout particulièrement une disponibilité maximale des données et en
éliminant les point individuel de défaillance. Initialement développée par Facebook,
l'application a été libérée dans l'espace open-source et rapidement adoptée par
plusieurs grandes entreprises gérant d'importants volumes de données, telles que
Twitter ou digg.com.
Pour interroger les traces de manière la plus rapide possible, Novapost nous a
proposé d’utiliser une architecture basée sur Hadoop, un frameworkd’implémentation de l’algorithme MapReduce en Java développé lui aussi par
Apache. Hadoop est un système scalable, avec une bonne tolérance aux fautes pour
le stockage et le traitement de gros volumes de données. Il utilise un système de
fichiers distribué appelé HDFS (Hadoop Distributed File System) mais peut aussi
effectuer des opérations directement dans une base de donnée SQL.
d) Travail à effectuer
Les objectifs au commencement du projet étaient les suivants :
Etudier Cassandra et son modèle de base de données
Définir une structure de base de données adaptée
Etudier Hadoop et l’algorithme MapReduce
Proposer une implémentation de prototype alliant Hadoop à Cassandra permettant
d’interroger les traces via des opérations MapReduce
Effectuer des tests de performance du prototype : montée en charge, insertion
massive de donnée, etc.
Optimiser le modèle pour obtenir qu’il soit au maximum parallélisé.
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 6/22
II. Cassandra
a) Introduction
Le modèle de donnée de Cassandra est plus ou moins dérivé de celui de BigTable, unSGBD NoSQL développé par Google. Les développement de Cassandra ont
commencés au sein de Facebook, puis ont été transmis à la communauté Open
Source. Cette base de données non relationnelle comme toute base NoSQL a pour
but d'améliorer les bases de données dans une direction nécessitant une évolutivité
horizontale. Sa structure se rapproche de celle de tous les autres modèle NoSQL : on
dit que c’est une base orientée colonne.
Cassandra peut être pensée comme une structure à 4 dimensions dont les noms sont
les Keyspaces, les ColumnFamily, les SuperColumns et les Colonnes. Un keyspace est
composé de ColumnFamily, qui contient des lignes (rows), identifiés par une clé.Chaque row contient des colonnes. Une colonne est un triplet {clé, valeur,
timestamp} qui s’apparente à un tuple.
Une ColumnFamily peut être de type super : ses rows ne contiennent alors pas des
colonnes mais des SuperColumn. Une SuperColumn est elle aussi un triplet {clé,
valeur, timestamp}, dont l’élément « valeur » contient lui-même une colonne (triplet
{clé, valeur, timestamp}.
Les SGBD classiques sont orientés lignes. Chaque ligne contient un tuple qui a un
nombre précis d’attributs. Dans un SGBD orienté colonne, chaque ligne peut stocker
un nombre différent de colonnes, et deux lignes appartenant à la mêmeColumnFamily (plus ou moins équivalente à une table dans un SGBD classique)
peuvent contenir des colonnes de types différents. Il n’y a alors plus de relations
entre les données au sens d’un SGBD relationnel classique : il faut penser plus en
termes d’efficacité des requêtes qu’en termes de relation entre les données.
b) La structure de données
Les Keyspaces:Il faut penser les keyspaces comme des espaces de travail, des domaines. Il s’agit du
plus haut niveau d’organisation de Cassandra.
Les colonnes :
Les colonnes sont des structures qui sont identifiées par une clé (aussi appelé nom)
et une valeur défini par l’utilisateur ainsi que par un timestamp qui indique la
dernière date à laquelle a été modifiée la donnée. Il faut noter que dans Cassandra
les clés ont une valeur informative, elles ne sont pas générées de manière arbitrairecomme pour les tuples d’une base de données SQL. Ainsi on peut par exemple
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 7/22
prendre comme clé le nom de l’attribut, comme dans cet exemple :
{ // ceci est une colonne
name: "emailAddress",
value: "[email protected]",
timestamp: 123456789}
Les colonnes peuvent être triées par leur clé ou leur timestamp. Ce paramètre doit
être déterminé à la création de la ColumnFamily, car les colonnes sont triées à leur
insertion.
Les super-colonnes :
Les colonnes de type super sont des structures qui ont une clé, un timestamp et quiont pour valeur un nombre infini de colonnes associées, chacune repérée par une clé
qui est simplement le nom de la colonne. Ils ont les mêmes caractéristiques que les
colonnes. L’ordre de tri peut encore être explicitement donné dans un fichier de
configuration, pour chacune des familles de colonnes.
{ // cest une SuperColumn
name: "homeAddress",
value: {
// qui contient 3 colonnes
{name: "street", value: "1234 x street", timestamp:123456789},
{name: "city", value: "san francisco", timestamp: 123456789},
}
}
Si on simplifie en ignorant le timestamp et les écritures de “name””value” on obtient
quelque chose plus lisible:
homeAddress: {
street: "1234 x street",
city: "san francisco",
}
Les familles de colonnes (ColumnFamily) :
Un keyspace est composée d’une ou plusieurs Familles de colonnes. Le nombre, le
nom, le type (simple ou super), le format de stockage des données, ainsi que les
autres paramètres des ColumnFamily sont fixés lors de leur création . Il n’y pas delimitation quant au nombre de Familles de colonnes mais ce nombre doit rester
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 8/22
relativement restreint : chacune d’elle est stockées dans des systèmes de fichier
distinct, il est donc plus couteux d’accéder à plusieurs ColumnFamily différentes
simultanément.
Au sein de chaque famille, les données sont stockées en ligne (identifié par une clé
elle aussi défini par l’utilisateur) qui contient un ensemble de colonnes ou de supercolonnes.
On est assez proche dans ce cas de la notion de table, au sens SGBDR classique.
UserProfile = { // ceci est une ColumnFamily
phatduckk: { // ceci est la clé de la row
// cette row contient 3 colonnes
username: "phatduckk",
email: "[email protected]",
phone: "(900) 976-6666"
}, // end row
ieure: { // ceci est la clé d’une autre row de la même ColumnFamily
// cette row contient 5 colonnes
username: "ieure",
email: "[email protected]",
phone: "(888) 555-1212"
age: "66",
gender: "undecided"
},
}
Les familles de colonnes peuvent être de type Super également, dans ce cas chaque
ligne contient un ensemble de SuperColumns et sont toujours identifiées par une clé.
AddressBook = {// ceci est une ColumnFamily de type super (ou SuperColumnFamily)
Paul: { // ceci est la clé de la row, elle correspond ici au propriétaire
de l’AddressBook
// ici nous avons deux SuperColumn dans cette row, chaque SuperColumn
est une entrée de l’AdressBook
John: { // SuperColumn qui contient 3 colonnes
street: "Howard street",
zip: "94404",
city: "FC",
state: "CA"
},
Kim: {
street: "X street",
zip: "87876",
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 9/22
city: "Balls",
state: "VA"},
}, // end row
Pierre: {// ceci est la clé d’une autre row
joey: {
street: "A ave",
zip: "55485",
city: "Hell",
state: "NV"
},
William: {
street: "Armpit Dr",
zip: "93301",
city: "Bakersfield",
state: "CA"
},
},
}
Ci-dessous un exemple graphique pour la gestion de magasins de jouets :
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 10/22
c) Les avantages
Flexibilité du schéma : Cassandra permet de ne pas figer les structures qui seront
utilisées. On peut ajouter ou en retirer au fur et à mesure des SuperColumn ou des
colonnes indépendamment pour chaque row. Attention il faut néanmoins, aumoment du démarrage du cluster fixer les noms des keyspaces et des ColumnFamily
qui seront utilisées (on ne peut pas créer à la volée).
Scalabilité réelle : Cassandra permet de passer à l’échelle très facilement. On peut
ajouter une machine à la volée sans avoir a redémarrer aucun processus, ni changer
les requêtes ou avoir a re-dispatcher les données. Par ailleurs, des outils permettent
d’équilibrer le volume de donnée entre les différents nœuds automatiquement.
Ecritures distribuées : Cassandra est conçue pour que les écritures n’échouent
jamais, il n’y a pas de « single point of failure » : si un nœud tombe, un autre prend
le relais. Par ailleurs les données sont répliquées lors de l’écriture. Ainsi si un nœud
tombe on peut accéder à la donnée sur un autre nœud.
d) Les limites
Toutes les données contenues dans une row doivent tenir sur un même disque, car
seules les clés des rows sont utilisées pour déterminer les facteurs de réplication de
celle-ci entre les différents nœuds. Une colonne ne doit par ailleurs pas excéder la
taille de 2 GB.
En outre, dans les ColumnFamily de type super, seule les colonnes sont indexées, et
donc l’accès à une colonne déserialise toutes les colonnes qui sont contenues dans la
même SuperColumn. Cet inconvénient devrait être supprimé dans les prochaines
versions.
III. Hadoop et HDFS
a) Introduction
HDFS est un système de fichier distribué. Il se démarque des autres systèmes de
fichier distribués par sa grande tolérance aux fautes et le fait qu’il soit conçu pour
être déployé sur des machines à faible coût. HDFS fournit un haut débit d’accès aux
données et est adapté pour les applications qui nécessitent de grands groupes de
données. Il a été à l’origine conçu pour le projet de moteur de recherche web
Apache Nutch.
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 11/22
b) Conception et déploiement d’un système de fichiers distribué
HDFS a une architecture de type maitre/esclave. Un cluster HDFS est constitué d’un
unique NameNode, un serveur maitre qui gère le système de fichier et notamment
les droits d’accès aux fichiers. A cela s’ajoute des DataNodes, en général un parnœud dans le cluster, qui gère le stockage des données affectés au nœud sur lequel
elle se trouve.
HDFS dispose d’un espace de nom et permet de stocker les données sous forme de
fichiers. Chaque fichier est divisé en blocs, qui sont stockées dans un groupe de
DataNodes. Ce sont eux qui répondent aux requêtes de lecture et écriture qui vienne
du client, et ce sont eux également qui gèrent la création, la suppression et la
réplication des blocs selon les instructions du NameNode.
HDFS est conçu pour tourner sur des machines simples sous GNU/linux, et est
programmé en Java. Toute machine qui dispose de Java peut donc faire tourner un
NameNode ou un DataNode.
Les noeuds communiquent entre eux via SSH. Il faut donc entrer la clé publique de
chaque DataNode dans le fichier authorized_keys du NameNode afin qu’il puisse se
connecter aux autres noeuds via ssh sans avoir besoin de taper un mot de passe à
chaque fois.
Le NameNode dispose d’un fichier de configuration dans lequel il entre l’adresse de
chaque machine sur laquelle tourne un DataNode, et se connecte ensuite à chacune
de ces machines via SSH au démarrage de HDFS. Par ailleurs, le NameNode est
l’arbitre et le dépositaire de toutes les métadonnées du HDFS. HDFS est conçu de
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 12/22
telle sorte qu’aucune donnée de l’utilisateur ne transite par le NameNode.
Chaque donnée insérée dans HDFS est répliquée pour assurer sa persistance. Le
facteur de réplication est égal à 3 par défaut, mais il peut être modifié pour chaque
fichier.
Par ailleurs, HDFS est « rack-aware », c'est-à-dire que la réplication s’adapte à
l’architecture du cluster. Ainsi si on laisse le facteur de réplication par défaut à 3, en
écrivant un block sur un DataNode, HDFS va ensuite écrire la première réplique sur
un nœud dans un autre rack, puis la dernière réplique sur un nœud du même rack
que la première.
c) Prévention des échecs d’écriture
Chaque DataNode envoie périodiquement un “heartbeat” au NameNode. Si leNameNode ne reçoit plus ce heartbeat d’un DataNode, il considère ce dernier
comme inaccessible, et re-réplique les données en conséquence.
Par ailleurs, HDFS intègre un mécanisme de checksum afin de détecter les données
corrompues. Ainsi, à sa création chaque fichier du HDFS se voit attribuer un
checksum. Quand un client accède à un fichier dans le HDFS, il vérifie que les
données reçues de chaque DataNode corresponde au checksum donné. Si ce n’est
pas le cas, il peut choisir de récupérer un bloc de données d’un a utre DataNode qui
en a la réplique.
Le seul “single point of failure” est le NameNode. Si ce dernier tombe, il est
nécessaire de le redémarrer manuellement, sauf si on a lancé l’exécution d’un
SecondaryNameNode qui peut alors prendre le relais.
d) Paramètres de performances
HDFS est fait pour stocker de gros fichiers (chaque fichier est divisé en bloc de 64 MB
par défaut). D’après la documentation officielle, un fichier typique dans HDFS fait
une taille de l’ordre du GB voire du TB. HDFS est fait pour une très grande scalabilité
et tourne déjà en production sur des très gros clusters (plus de 1000 machines) dans
des sociétés comme Facebook ou Yahoo.
HDFS est également fait pour qu’on puisse y insérer de très gros fichiers très
rapidement (quelques minutes pour quelques GB), du moment qu’on dispose d’un
cluster assez puissant, en terme de puissance de calcul aussi bien qu’en terme de
charge réseau.
De plus HDFS est avant tout conçu pour être utilisé avec Hadoop. La philosophie de
l’implémentation d’Hadoop repose sur le principe qu’il est plus efficace de déplacer
de la capacité de calcul que des donnés (“Moving Computation is Cheaper thanMoving Data”). HDFS fournit donc une interface pour pouvoir déplacer le traitement
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 13/22
des données au plus près de celles-ci.
En outre, Hadoop n’est pas fait pour exécuter un job de manière ponctuelle, mais
plutôt pour exécuter une file de jobs en mode batch de manière périodique. Yahoo!
a développé des outils afin de gérer la planification et la sécurisation de l’exécution
de jobs et notamment dans le cas ou plusieurs utilisateurs utilisent le même cluster.
Par ailleurs HDFS ne gère pas pour l’instant le rééquilibrage de charge. Ainsi si on
rajoute un DataNode, aucune donnée ne sera déplacée vers celui-ci afin de répartir
la charge, il faut le faire manuellement.
e) MapReduce
L'opération "map", écrit par l'utilisateur, consiste à produire une paire clé/valeurs
intermédiaire pour chaque paire de clé/valeur reçue en entrée. Ensuite la librairieMapReduce groupe toutes les clés intermédiaires associées à la même valeur et les
passe à la fonction "reduce". L'opération "reduce" consiste à fusionner les valeurs
d'une même clé intermédiaire afin de créer une unique valeur associée à cette clé et
renvoyer un unique couple clé/valeur en sortie pour chaque clé intermédiaire.
L’exemple classique est celui du WordCount. En entrée l'algorithme reçoit le couple
"nom du document"/"contenu". L'opération "map" crée une liste de couple clé
intermédiaire/valeur (ici "mot recherché/"1" où "1" correspondant à une occurrence
du mot dans le contenu du document) qu'elle passe à la fonction "reduce". Ensuite la
fonction "reduce" fusionne les couples de clés intermédiaire/valeur correspondant àla même clé intermédiaire (ici "mot recherché") en incrémentant un compteur pour
chaque occurrence de la même clé dans la liste de clés intermédiaires. Elle renvoie
ensuite en sortie le couple clé/valeur "mot recherché"/"nombre d'occurrence".
Les jobs MapReduce se structurent toujours autour de trois parties : deux classes
static « Mapper » et « Reducer », et une méthode main qui dirige l’application.
L’exécution des jobs se fait à l’aide d’un JobTracker et de Tasktrackers : lors de son
exécution le job est soumis au JobTracker qui s’occupe de le distribuer au
Tasktracker qui tourne sur chaque nœud. Le JobTracker choisit toujours les
TaskTracker qui sont les plus proches de l’emplacement de la donnée à traiter.
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 14/22
IV. Mise en place du prototype et tests
a) Environnement de travail
Nous avions besoin des droits administrateur pour pouvoir travailler avec Hadoop etCassandra. Ainsi nous avons choisi de travailler avec les machines virtuelles installées
sur les comptes Unix de l’école, le tout sur des comptes locaux afin d’avoir un espace
de stockage suffisant et un système de fichier performant.
Nous avons cependant été limités par la performance du matériel : il n’est possible
d’affecter qu’un seul cœur à une machine virtuelle et seulement la moitié de la RAM
totale (soit 2 GB) du PC hôte.
Nous avons travaillé avec la version 0.7 beta 2 de Cassandra, car la version 0.7
apporte de nombreuses fonctionnalités supplémentaires par rapport à la version 0.6,
notamment en termes de compatibilité avec Hadoop.
Par ailleurs nous avons utilisé la version 0.21 d’Hadoop.
b) Conception de la base de données
Cassandra est une base de donnée NoSQL, il faut pour cela s’affranchir de la pensée
« relationnelle » des bases de données classiques : la base doit être construite afin
de permettre l’accès le plus rapide possible aux données, quitte à avo ir des
redondances. Ainsi Amin Sakka a préféré ne pas nous donner le schéma de la base
de données relationnelle utilisée par Novapost actuellement, mais plutôt lesrequêtes principales par lesquelles s’opèreront les accès aux fichiers dans la base.
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 15/22
Les requêtes en question sont les suivantes :
String createTrack (String documentId, String identificationSystem) : crée
une trace pour un document, retourne l'identifiant de trace unique TUUID
void addAction (String trackId) : ajoute une action à la trace du document
void addAction (String documentId, String identificationSystem) : ajoute une action à
la trace du document
Track getTrackByTrackId (String trackId): retourne la trace d'un document
Track getTrack(String documentId, String identificationSystem) : retourne la trace
d'un document
List <Track> getTrackByFingerPrint (String fingerPrint, String
algorithm): retourne la liste de traces des documents ayant cette empreinte (le
résultat est une liste car plusieurs copies du même document peuvent exister)
Ainsi, nous nous sommes mis d’accord sur le modèle suivant (ici en notation JSON) :
Keyspace : LXTrack
{
"Document" (SCF){
RowKey: ApplicationReference {
SCKey: OwnerReference {
{name:"TUUID" value: TUUID}
{name: form, value: FingerPrint}
}
}
"Track" (SCF){
RowKey: "Declaration" {
SCKey: TUUID {
{name: timeStamp, value: declarationContent}
}
RowKey: "Document" {
SCKey: TUUID {
{name: ApplicationReference, value: OwnerReference}
}
}
RowKey: "Fingerprint” {
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 16/22
SCKey: TUUID {
{name: form, value: FingerPrint}
}
}
}
"Fingerprint" (SCF){ {
RowKey: "Document" {
SCKey: FingerPrint {
{name: ApplicationReference, value: OwnerReference}
}
}
RowKey: "Track" {
SCKey: FingePrint {
{name: algorithm, value: TUUID}
}
}
}
}
Nous avons choisir de répéter certaines données, car d’une part cela permet
d’effectuer chaque requête de manière toute aussi efficace. D’autre part Cassandra
est construite de telle sorte que les écritures sont plus rapides que les lectures, ce
qui nous a poussés à penser en termes d’optimisation des accès et non des
insertions.
Par ailleurs même si répliquer les données ne nous a pas paru être une solution
optimale d’un point de vue sécurité (la même donnée est écrite deux fois à desmoments différents à deux endroits différents, ce qui ne garantie pas la consistance
de cette donnée), elle avait l’avantage de nous permettre de pouvoir comparer
différentes façons d’accéder aux données avec Hadoop.
c) Insertion massive dans la base
Nous avons effectués des insertions massives de traces dans Cassandra en suivant le
modèle décrit précédemment sur un cluster de 2 puis de 5 machines. Ainsi l’objectif
était d’insérer 10 millions de traces dans Cassandra.
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 17/22
Pour cela nous avons utilisé un client haut niveau développé pour Cassandra appelé
Hector. Ce dernier fournit une API facilement compréhensible pour insérer et
accéder à des données dans Cassandra, le client fournit avec Cassandra, Thrift, étant
bas niveau et plutôt difficile à prendre en main. Hector gère un grand nombre de
paramètres de manière automatique, ce qui permet de faire des insertions et
requêtes de manière assez simple.
Cependant, nous ne sommes jamais arrivés à un tel résultat. En effet, Cassandra est
censé flusher les données sur le disque quand son « heap space » (mémoire vie
allouée à Cassandra) dépasse un certain seuil, ce qu’elle ne fait pas. Au lieu de ça
Cassandra flush de moins en moins les données jusqu’à se retrouver bloquée et
crasher. Nous avons essayé de forcer Cassandra à flusher en modifiant de nombreux
paramètres mais ça n’a rien changé.
Ainsi, nous n’avons pu insérer qu’environ 1 700 000 traces dans la base de donnée
sur un cluster de 5 machines.
Evolution du heap space pour l’insertion de 1 500 000 traces consécutives (machine
qui insérait les données) :
Allure de la courbe sur les autres machines (le heap space de la machine n’était ici
pas vide au démarrage du test) :
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 18/22
Ainsi on remarque que les donnés sont principalement insérées sur la machine ou
s’exécute le programme d’insertion mais également distribuées sur les autres
machines.
Par ailleurs Cassandra stocke ses données sous plusieurs formes : tout d’abord dans
son heap space, puis dans des commitlogs, qui sont des fichiers écrit en permanence
durant l’exécution au cas où le nœud crash, et enfin dans son système de fichier sur
le disque lorsque le heap-space est flushé. Ainsi nous avons vu sur plusieurs forums
des utilisateurs de Cassandra conseiller de ne pas écrire les commitlogs et les flushs
du heap space sur le même disque afin de gagner en performance, ce que nous ne
pouvions pas faire.
De plus, les utilisateurs conseillent un heap space de l’ordre de 4 à 8 GB pour faire
tourner Cassandra, le fait que nous ne disposions que de 1 GB a surement limiter nos
possibilités de test.
d) Couplage Hadoop / Cassandra
Nous avons installé et fait fonctionner Hadoop et HDFS sur un cluster de 6 machines
sans problèmes. Nous avons notamment pu exécuter un job MapReduce simple, le
célèbre wordcount, qui compte les mots contenus dans plusieurs fichiers. Nous
avons cependant été surpris par le temps que mettait Hadoop pour effectuer une
opération aussi simple à partir de fichier contenus dans le HDFS, ce qui a confirmé le
fait que HDFS est fait avant tout pour stocker de gros fichier, l’accès aux fichiers
étant plutôt long.
Nous avons ensuite entrepris de faire fonctionner Hadoop au dessus de Cassandra,
étant donné que Cassandra fournit une interface pour surcharger les classes
d’Hadoop de manière à ce que ce dernier charge ses données directement depuis
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 19/22
Cassandra au lieu de les charger depuis le HDFS. Cependant, nous n’avons pas réussi
à exécuter de job MapReduce avec cette interface. Après des recherche sur des
forums et des mailing liste relatives à l’utilisation d’Hadoop, il se trouve que nous
avons utilisé une version de Cassandra trop ancienne (la version stable est sortie
mi- janvier) avec une version d’Hadoop trop récente (apparemment la version 0.21
comporte encore de nombreux bugs liés à l’interface avec Cassandra). Cependant il
était trop tard pour migrer toute notre configuration.
e) HBase
Il nous a semblé judicieux de comparer Cassandra à HBase, car même si nous
n’avions ni le temps ni le matériel pour réellement effectuer des tests de
performances permettant de comparer les deux, nous avons essayé de faire
l’inventaire des principales caractéristiques et différences entre ces deux SGBD
NoSQL.
Par ailleurs, HBase a été développé dans le but premier d’être compatible avec
Hadoop, il y a donc de fortes chances qu’il soit plus facile d’implémenter Hadoop sur
HBase. Cependant le personnel de Novapost souhaitait que nous utilisions Cassandra
car eux-mêmes s’étaient documenté sur le sujet et jugeait que ce SGBD serait plus
adapté à leur besoins.
Ainsi nous sommes arrivés à cette comparaison établie suite aux avis que nous avons
pu lire sur des blogs et sites spécialisés :
Cassandra Hbase
Pas de notion de table La notion de tables existe
Tri des colonnes Pas de tri de colonnes
Concept de SuperColumn => flexibilité Pas de SuperColumn
Support de Map Reduce très récent.
Nécessité d’un cluster Hadoop => transfert
entre cluster.
Cassandra adapté au stockage mais moinsau traitement de données
Map Reduce a toujours été utilisé avec
Hbase.
Hbase construit sur Hadoop => Pas de
transfert de données.Hbase très bien adapté au traitement de
données.
Maintenance relativement simple si pas
d’Hadoop
Maintenance assez complexe
Pas de Java API et peu de documentation Possède un Java API => Facilite la
documentation
Pas de serveur maître => Pas de « Single
Point of failure »
Serveur maître à la fois Datanode et
Namenode, si serveur maître en panne,
seul le Namenode pose problèmeAdapté aux clusters de machines situées à Adapté même aux clusters
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 20/22
courtes distances les uns des autres,
repose sur la rapidité de transfert sur fibre
transcontinentaux.
Donne priorité à la disponibilité des
données
Donne priorité à la consistance des
données
V. Difficultés rencontrées
a) Manque de documentation
La principale difficulté que nous avons rencontrée a été le manque de
documentation due à la nouveauté des technologies utilisées, notamment Cassandra.
En effet il y a un grand engouement pour ces technologies, mais peu de gensmaitrisent leur mise en production. Ainsi de nombreux articles de blog ou de sites
spécialisés détaillent les pour et les contre de chaque implémentation, et annoncent
les différentes fonctionnalités offertes par chaque technologie, mais peu de
documentation existe sur la mise en application de ces technologies.
Par ailleurs, nous pensions au départ que le développement du prototype pour
Novapost était l’objectif principal, mais nous avons compris au fur et à mesure des
discussions avec nos professeurs encadrant que l’objectif était avant tout de bien
comprendre et de tester Hadoop et Cassandra car eux-mêmes ne connaissaient que
très peu ces technologies, ils comptaient donc en premier lieu sur nous pour bienleur expliquer leur fonctionnement et les problèmes associés afin d’évaluer la
viabilité d’une mise en production.
Ainsi de nombreux messages d’erreurs sont restés inexplicables pour nous malgré
nos recherches, et il était assez frustrant de voir sur les forums que nous n’étions pas
les seuls à tomber sur ces erreurs mais que personne ne pouvait donner de solution.
b) Matériel trop peu puissant
Les machines virtuelles nous ont offert un grand confort de travail, mais elles
étaient limitées par la faible puissance qu’on pouvait leur affecter. A de nombreuses
reprises nous avons constatés que les personnes qui utilisent Hadoop conseillent des
configurations assez musclés (8 GB de RAM et au moins 4 cœurs) qui sont loin de la
puissance de notre machine virtuelle monoprocesseur dotée de 2 GB de RAM. En
outre nous n’avons jamais pu faire tourner le cluster sur plus de 6 machines, ce qui
limite également la performance.
Ainsi nous avons pu mettre en place des tests mais les résultats ne nous permettent
pas vraiment d’évaluer les performances d’Hadoop et Cassandra de manière chiffrée.
Elles nous ont cependant permis d’évaluer la complexité de la mise en place d’un tel
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 21/22
système distribuée et surtout de l’importance capitale de la configuration d’un tel
système. Nous nous sommes vite rendu compte que les performances de Cassandra
dépendent directement de la bonne configuration du cluster. Malheureusement
nous avons du limiter celle-ci du fait de la faible puissance des machines. Ainsi nous
aurions aimé étudier l’influence du facteur de réplication sur les performances de
Cassandra mais dès qu’on augmentait celui-ci le système crashait rapidement.
Conclusion
a) Conclusion personnelle
Nous avons énormément appris sur ce projet, et nous gardons le sentiment d’avoir
acquis des connaissances sur des technologies très prometteuses. L’utilisation
d’Hadoop et des bases de données NoSQL ne fait qu’augmenter, et sans elles des
systèmes comme Facebook ne pourraient pas fonctionner. Par ailleurs les blocages
auxquels nous avons fait face nous ont poussés à beaucoup nous documenter, ce qui
nous a permis de bien comprendre les mécanismes d’Hadoop et Cassandra.
Cependant nous ressentons de la frustration due aux nombreuses heures que nous
avons passés à configurer Hadoop et Cassandra, sans succès, pour finalement finir
sur un semi-échec puisque nous n’avons pas pu évaluer la performance de
l’association de ces deux technologies. En effet nous aurions aimé passer plus de
temps sur les problèmes d’implémentation et d’optimisation du modèle que sur la
configuration d’Hadoop et Cassandra.
Le manque de documentation et les nombreux bugs et incompatibilités que nous
avons rencontré nous a cependant montré l’importance du choix d’une technologie,
surtout lorsqu’il s’agit d’open source. Ainsi nous avons compris qu’il ne faut pas se
précipiter sur les version trop récentes d’un projet, car la documentation repose
beaucoup sur les retours des utilisateurs, et qu’une communauté importante est
primordiale : la plupart des solutions aux bugs que nous avons rencontré se trouvent
sur les mailing liste des projets concernés.
b) Estimation du temps de travail
Travail effectué Julien Siman Total (h)
Rendez-vous avec l’encadrant 8 8 16
Documentation sur Cassandra et conception
du modèle de donnée
10 10
20
Installation et configuration Cassandra
(Cluster)
12 10
22
8/2/2019 RapportGerlierChen
http://slidepdf.com/reader/full/rapportgerlierchen 22/22
Documentation sur Hector 4 2 6
Développement Hector-Cassandra 6 4 10
Mise en place et exécutions des tests 15 5 20
Documentation Hadoop 7 12 19
Installation et configuration Hadoop (Cluster) 12 14 26Intégration Hadoop/Cassandra 8 5 13
Rapport 12 20 32
Slides 3 4 7
Soutenance 1.50 1.50 191
Références
http://www.novapost.fr/
http://fr.wikipedia.org/wiki/NoSQL
http://fr.wikipedia.org/wiki/Cassandra_%28base_de_donn%C3%A9es%29
http://fr.wikipedia.org/wiki/Hadoop
http://www.geekontheloose.com/programming/java/cassandra-0-7-and-hector-for-noo
bs/
http://arin.me/blog/wtf-is-a-supercolumn-cassandra-data-model
http://cassandra.apache.org/
http://hadoop.apache.org/
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluste
r/
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster
/
http://cxwangyi.blogspot.com/2009/12/wordcount-tutorial-for-hadoop-0201.html
http://code.google.com/p/hadoop-map-reduce-examples/ http://www.higherpass.com/java/Tutorials/Building-Hadoop-Mapreduce-Jobs-In-Java/
http://cscarioni.blogspot.com/2010/11/hadoop-basics.html
http://www.datastax.com/sites/default/files/hector-v2-client-doc.pdf
http://www.divconq.com/2010/cassandra-columns-and-supercolumns-and-rows/
http://blog.octo.com/nosqleu-et-nosql-quen-est-il/