Introduction au Big Data et Hadoop
Introduction au Big Data et Hadoop
Support de cours
Big Data,
Hadoop et MapReduce
Retenons que :
1 Megaoctet = 106 octets
1 Gigaoctet = 109 octets
1 Teraoctet = 1012 octets
2
1 Petaoctet = 1015 octets
1 Exaoctet = 1018 octets
1Zttaoctet = 1021 octets
1.3.1. Volume
Internet étant le principal acteur dans l’avènement du Big Data, dans une minute Internet : on a
30h Vidéo téléchargées, 204 Millions d’emails échangés et 300 milles Tweets envoyés, …
1.3.2. Variété
Dans un contexte Big Data les données sont sous forme structurée (bases de données structurée, feuilles
de calcul venant de tableur,…) et non structurée (textes, sons, images, vidéos, données de capteurs,
fichiers journaux, medias sociaux, signaux,…) qui doivent faire l’objet d’une analyse collective. On
estime à 80% les données non structurées pour 20% des données structurées.
1.3.3. Vitesse
Fait référence à la vitesse à laquelle de nouvelles données sont générées et la vitesse à laquelle les
données sont traitées par le système pour être bien analysées.
1.3.4. Véracité
La véracité fait référence à la qualité de la fiabilité et la confiance des données (données bruités,
imprécises, prédictives,…)
1.3.5. Valeur
La démarche Big Data n’a de sens que pour atteindre des objectifs stratégiques de création de
valeur pour les clients et pour l’entreprise; dans tous les domaines d’activité: commerce, industrie,
services…En effet, le succès d’un projet Big Data n'a d'intérêt aux utilisateurs que s'il apporte de
la valeur ajoutée et de nouvelles connaissances.
3
distribution des données est réalisé à l'aide d'un Système de Fichiers Distribués-DFS (Distributed
File System).
4
Les perspectives d’utilisation de ces données sont énormes, notamment pour l’analyse d’opinions
politiques, de tendance industrielles, la génomique, la lutte contre la criminalité et la fraude, les
méthodes de marketing publicitaire et de vente etc…
MFD
Dir2
Dir1
Dir3
File1
File3 File2
5
Chapitre 2 :
Hadoop
2.1. Généralités
En 2004, Google a développé un paradigme de programmation appelé MapReduce. Yahoo! a mis
en place Hadoop comme implémentation de MapReduce en 2005 et a fini par le lancer en tant
que projet open source en 2007.
Hadoop est une plateforme (framework) open source conçue pour
réaliser d'une façon distribuée des traitements sur des volumes de
données massives, de l'ordre de plusieurs pétaoctets. Ainsi, il est
destiné à faciliter la création d'applications distribuées et
échelonnables (scalables). Il s'inscrit donc typiquement sur le terrain
du Big Data.
À l’instar des autres systèmes opérationnels, Hadoop possède les structures de base nécessaires à
effectuer des calculs: un système de fichiers, un langage de programmation, une méthode pour
distribuer les programmes ainsi générés à un cluster, un mode pour obtenir les résultats et arriver
à une consolidation unique de ces derniers, ce qui est le but.
Avec Hadoop, le Big Data est distribué en segments étalés sur une série de nœuds s’exécutant sur
des périphériques de base. Au sein de cette structure, les données sont dupliquées à différents
endroits afin de récupérer l’intégralité des informations en cas de panne. Il s'occupe de toutes
les problématiques liées au calcul distribué, comme l’accès et le partage des données, la
tolérance aux pannes, ou encore la répartition des tâches aux machines membres du cluster: le
programmeur a simplement à s'occuper du développement logiciel pour l'exécution de la
tâche.
6
Fig. 2.1. Composants de Hadoop
2.3. Le système de fichier (HDFS)
HDFS (pour Hadoop Distributed File System) est un système de fichiers distribué associé à
Hadoop. C'est là qu'on stocke les données d'entrée, de sortie, etc.
7
2.4. Architecture HDFS
Une architecture de machines HDFS inclut trois types de composants majeurs :
NameNode (noeud de nom) : Un Namenode est un service central (généralement appelé
aussi maître) qui s'occupe de gérer l'état du système de fichiers. Il maintient l'arborescence
du système de fichiers et les métadonnées de l'ensemble des fichiers et répertoires d'un
système Hadoop. Le Namenode a une connaissance des Datanodes dans lesquels les blocs
sont stockés.
Secondary Namenode : Le Namenode dans l'architecture Hadoop est un point unique de
défaillance (Single Point of Failure en anglais). Si ce service est arrêté, il n'y a pas un
moyen de pouvoir extraire les blocs d'un fichier donné. Pour répondre à cette problématique, un
Namenode secondaire appelé Secondary Namenode a été mis en place dans l'architecture Hadoop
version2. Son fonctionnement est relativement simple puisque le Namenode secondaire vérifie
périodiquement l'état du Namenode principal et copie les métadonnées. Si le Namenode principal
est indisponible, le Namenode secondaire prend sa place.
Datanode : Un Datanode contient les blocs de données. En effet, il stocke les blocs de données
lui-mêmes. Il y a un DataNode pour chaque machine au sein du cluster. Les Datanodes sont
sous les ordres du Namenode et sont surnommés les
Workers. Ils sont donc sollicités par les Namenodes lors des opérations de lecture et
d'écriture.
8
2.5. Les commandes de HDFS
La commande permettant de stocker ou extraire des fichiers de HDFS est l'utilitaire
console hadoop, avec l'option fs. Il réplique globalement les commandes systèmes standard
Linux. On trouve par exemple :
hadoop fs -put [Link] /data_input/[Link]
Permet de stocker le fichier [Link] sur HDFS dans le répertoire /data_input.
hadoop fs -get /data_input/[Link] [Link]
Permet d’obtenir le fichier /data_input/[Link] de HDFS et le stocker dans le fichier local
[Link].
hadoop fs -mkdir /data_input
Pour créer le répertoire /data_input
hadoop fs -rm /data_input/[Link]
Pour supprimer le fichier /data_input/[Link]
9
Chapitre 3 :
MapReduce
3.1. Généralités
En 2004, Google a développé un paradigme appelé MapReduce, et en 2005, Yahoo! a mis en
place Hadoop comme implémentation de MapReduce et a fini par le lancer en tant que projet
open source en 2007.
À l’instar des autres systèmes opérationnels, Hadoop possède les structures de base nécessaires à
effectuer des calculs: un système de fichiers, un langage de programmation, une méthode pour
distribuer les programmes ainsi générés à un cluster, un mode pour obtenir les résultats et arriver
à une consolidation unique de ces derniers, ce qui est le but.
Objectif : Calculer le total des ventes par magasin pour l’année en cours
Supposons que les lignes du livre aient la forme suivante: Jour Ville produit Prix
Possibilité́ :
Pour chaque entrée, saisir la ville et le prix de vente
Si on trouve une entrée avec une ville déjà saisie, on les regroupe en faisant la somme des
ventes
Dans un environnement traditionnel, on fera des Hash table sous la forme <clé-valeur>
Dans ce cas, la clé sera l’adresse du magasin et la valeur le total de ventes
10
2018-01-01 London Books 51.3
2018-01-01 Paris Music 22.5
2018-01-02 Rome Clothes 100.1
2018-01-02 London Clothes 46
Bien qu’il est fort possible de rencontrer des problèmes de taille mémoire, et que le traitement
séquentiel s’avère long en plus du problème classique de l’ajout de nouveaux magasins, le
résultat peut s’avérer correct.
2018-01-01 London Books 51.3
2018-01-01 Paris Music 22.5
2018-01-02 Rome Clothes 100.1
2018-01-02 London Clothes 46
Clé Valeur
London 97.3
Paris 22.5
Rome 100.1
Le Map-Reduce est un moyen plus efficace et plus rapide de traiter ces données, le principe
consiste en :
Au lieu d’avoir une seule personne qui parcourt le livre, on recruterait plusieurs.
Appeler un premier groupe les Mappers et un autre les Reducers
Diviser le livre en plusieurs parties, et en donner une à chaque Mapper
Les Mappers peuvent travailler en même temps, chacun sur une partie des données :
Mappers
Pour chaque entrée, saisir la ville et le total de ventes dans une fiche
Rassembler les fiches d’un même magasin dans une pile
11
Reducers
Chaque reducer sera responsable d’un ensemble de magasins
Collectent les fiches associées des différents mappers
Pour chaque ville, ils parcourent les piles en ordre alphabétique et font la somme des
enregistrements
Fonction Reduce : prend en entrée une liste intermédiaire de « Clé1, Valeur1 » et fournit en
sortie une ensemble de « Clé1, Valeur2 » :
Reduce(key1,list(value1)) -> value2
12
lorsqu’un Worker de type Map a fini son traitement, le Master regroupe, trie et renvoie le résultat
à un Worker de type Reduce
13
celui qui ny croyait pas
fou qui fait le délicat
fou qui songe a ses querelles
D’abord, on détermine la clé à utiliser pour l’opération MAP, et écrire son code. Comme on
s'intéresse aux occurrences des mots dans le texte, la clef qu’on choisit est le mot.
L’opération MAP consiste à parcourir le fragment considéré et, pour chacun des mots, émettre le
couple clef/valeur: (MOT ; 1). Cela signifie que nous avons rencontré une fois le mot. Le pseudo
code de la fonction Map peut être :
Une fois l’opération « Map » achevée, un mécanisme intermédiaire permet de regrouper les
couples par clé commune ; on obtient :
(celui ;1) (celui ;1)
(qui ;1) (qui ;1) (qui ;1) (qui ;1)
(croyait ;1) (croyait ;1)
(fou ;1) (fou ;1)
(au ;1)
(ciel ;1)
etc.
La fonction « Reduce » considère chacun des groupements de clés où elle va opérer à une somme.
Le pseudo code peut être :
Total=0
Pour chaque Couple dans Groupe
Total=Total+1
emettre(mot ; total)
A la fin de l’opération, on obtient pour chaque mot son nombre d’apparition dans le texte.
14
(celui ;2)
(qui ;4)
(croyait ;2)
(au ;1)
(ciel ;1)
etc.
16
Chapitre 4 :
Mise en œuvre de MapReduce sous Hadoop
4.1. Architecture MapReduce de Hadoop
Comme pour HDFS, la gestion des tâches de Hadoop se base sur deux serveurs (des
daemons):
Le JobTracker, qui va directement recevoir la tâche à exécuter (un .jar Java), ainsi
que les données d'entrées (nom des fichiers stockés sur HDFS) et le répertoire où stocker
les données de sortie (toujours sur HDFS). Il y a un seul JobTracker sur une seule
machine du cluster Hadoop. Le JobTracker est en communication avec le
NameNode de HDFS et sait donc où sont les données.
Le TaskTracker, qui est en communication constante avec le JobTracker et va recevoir les
opérations simples à effectuer (MAP/REDUCE) ainsi que les blocs de données
correspondants (stockés sur HDFS). Il y a un TaskTracker sur chaque machine du
cluster.
17
On soumettra alors le nom des fichiers d'entrée, le nom du répertoire des résultats, et le .jar lui-
même au JobTracker: il s'occupera du reste (et notamment de transmettre les programmes
MAP et REDUCE aux serveurs TaskTracker des machines du cluster).
L'entrée de MapReduce doit être fait à partir de fichiers dans HDFS où Chaque bloc contient une
liste de pairs clé-valeur.
4.1.1. Le JobTracker
Le déroulement de l'exécution d'une tâche Hadoop suit les étapes suivantes du point de vue du
JobTracker :
1. Le client (un outil Hadoop console) va soumettre le travail à effectuer au JobTracker : une
archive java .jar implémentant les opérations Map et Reduce. Il va également
soumettre le nom des fichiers d'entrée et l'endroit où stocker les résultats.
2. Le JobTracker communique avec le NameNode HDFS pour savoir où se trouvent les
blocs correspondant aux noms de fichiers donnés par le client.
3. Le JobTracker, à partir de ces informations, détermine quels sont les nœuds
TaskTracker les plus appropriés, c'est à dire ceux qui contiennent les données sur
lesquelles travailler sur la même machine, ou le plus proche possible (même rack/rack
proche).
4. Pour chaque « morceau » des données d'entrée, le JobTracker envoie au TaskTracker
sélectionné le travail à effectuer (MAP/REDUCE, code Java) et les blocs de données
correspondants.
5. Le JobTracker communique avec les noeuds TaskTracker en train d'exécuter les
tâches. Ils envoient régulièrement un « heartbeat », un message signalant qu'ils
travaillent toujours sur la sous-tâche reçue. Si aucun heartbeat n'est reçu dans une
période donnée, le JobTracker considère la tâche comme ayant échouée et donne le
même travail à effectuer à un autre TaskTracker.
6. Si par hasard une tâche échoue (erreur java, données incorrectes, etc.), le TaskTracker va
signaler au JobTracker que la tâche n'a pas pu être exécutée.
7. Le JobTracker va alors décider de la conduite à adopter :
Demander au même TaskTracker de ré-essayer.
Redonner la sous-tâche à un autre TaskTracker.
Marquer les données concernées comme invalides, etc.
Il pourra même blacklister le TaskTracker concerné comme non-fiable dans certains
cas.
8. Une fois que toutes les opérations envoyées aux TaskTracker (MAP + REDUCE) ont été
effectuées et confirmées comme effectuées par tous les noeuds, le JobTracker
marque la tâche comme « effectuée ». Des informations détaillées sont disponibles
(statistiques, TaskTracker ayant posé problème, etc.).
Remarques:
Par ailleurs, on peut également obtenir à tout moment de la part du JobTracker des informations
sur les tâches en train d'être effectuées: étape actuelle (MAP, SHUFFLE, REDUCE), pourcentage
de complétion, etc.
18
4.1.2. Le TaskTracker
Le TaskTracker dispose d'un nombre de « slots » d'exécution. A chaque « slot »
correspond une tâche exécutable (configurable). Ainsi, une machine ayant par exemple un
processeur à 8 cœurs pourrait avoir 16 slots d'opérations configurées.
Lorsqu'il reçoit une nouvelle tâche à effectuer (MAP, REDUCE, SHUFFLE) depuis
le JobTracker, le TaskTracker va démarrer une nouvelle instance de Java avec le
fichier .jar fourni par le JobTracker, en appelant l'opération correspondante.
Une fois la tâche démarrée, il enverra régulièrement au JobTracker ses messages
heartbeats. En dehors d'informer le JobTracker qu'il est toujours fonctionnels, ces messages
indiquent également le nombre de slots disponibles sur le TaskTracker concerné.
Lorsqu'une sous-tâche est terminée, le TaskTracker envoie un message au
JobTracker pour l'en informer, que la tâche se soit bien déroulée ou non (il indique
évidemment le résultat au JobTracker)
4.1.3. Architecture Hadoop
De manière similaire au NameNode de HDFS, il n'y a qu'un seul JobTracker et s'il
tombe en panne, le cluster tout entier ne peut plus effectuer de tâches. Des résolutions aux
problèmes sont ajoutées dans la version 2 de Hadoop.
Généralement, on place le JobTracker et le NameNode HDFS sur la même machine (une
machine plus puissante que les autres), sans y placer de TaskTracker/DataNode HDFS
pour limiter la charge. Cette machine particulière au sein du cluster (qui contient les deux «
gestionnaires», de tâches et de fichiers) est communément appelée le noeud maître («Master
Node »). Les autres noeuds (contenant TaskTracker + DataNode)
sont communément appelés noeuds esclaves (« slave node »).
19
4.2. Exemple illustratif
Les données: Les données utilisées pour cet exemple proviennent du National Climatic Data
Center, les données sont stockées sous forme de lignes ASCII, où chaque ligne représente un
enregistrement. Chaque enregistrement comporte un certain nombre d’informations
météorologiques, certaines sont optionnelles ou de longueur variable, mais nous ne nous
intéresserons qu’à la température qui est toujours présente et a une largeur de champ fixe.
Les fichiers de données sont organisés par date et par station d’observation. Il y’a un répertoire
pour les données pour chaque année. Exemple pour 1990:
% ls raw/1990 | head
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
20
Pour cet exemple les données sont présentées à la fonction Map sous forme de paire clé-valeur
(offset/ligne):
(0, 0067011990999991950051507004…9999999N9+00001+99999999999…)
(106, 0043011990999991950051512004…9999999N9+00221+99999999999…)
(212, 0043011990999991950051518004…9999999N9-00111+99999999999…)
(318, 0043012650999991949032412004…0500001N9+01111+99999999999…)
(424, 0043012650999991949032418004…0500001N9+00781+99999999999…)
Les deux premières sont des patrons (templates) paramétrées par les types des clés et des valeurs.
21
4.3.1. Les types de données MapReduce
La classe Mapper est paramétrée par 4 types. Ce ne sont pas les types standard de Java, mais des
types spéciaux permettant de transmettre efficacement des données entre les différents
ordinateurs du cluster.
Type Description
Text Chaîne UTF-8
BooleanWritable Booléen
IntWritable Entier 32 bits
LongWritable Entier 64 bits
FloatWritable Réel 32 bits
DoubleWritebale Réel 64 bits
Les types Text, IntWritable. . . sont des implémentations d’une interface appelée Writable. Cette
interface comprend :
un constructeur. On peut mettre la valeur initiale en paramètre. IntWritable
val = new IntWritable(34);
un modificateur : void set(nouvelle valeur);
[Link](35);
un accesseur : type get()
int v = [Link]();
L’interface Writable permet la sérialisation, c’est à dire l’écriture d’une structure de données sous forme
d’octets et l’opération inverse, la dé-sérialisation qui permet de reconstruire une structure de données à
partir d’octets.
La sérialisation est nécessaire pour échanger des données entre machines. On ne peut pas
simplement échanger les octets internes car les machines du cluster ne sont pas obligatoirement
toutes pareilles : nombre d’octets, ordre des octets. . .
La classe Text permet de représenter n’importe quelle chaîne. Elle possède quelques méthodes à
connaître :
22
String toString() extrait la chaîne Java
int getLength() retourne la longueur de la chaîne
int charAt(int position) retourne le code UTF8 (appelé point) du caractère présent à cette
position
La méthode reduce reçoit une collection de valeurs venant du Mapper. CleI et ValeursI sont les
clés et valeurs intermédiaires. Il faut itérer sur chacune pour produire la valeur de sortie du
réducteur.
Comme pour map, la classe est paramétrée par les types des clés et des valeurs à manipuler. Ce
sont des Writable : Text, IntWritable. . .
Il est obligatoire que les types des clés TypCleI et valeurs d’entrée TypValI du réducteur soient
exactement les mêmes que les types des clés et valeurs de sortie du mapper. Si vous mettez des
types différents, ça passe à la compilation mais il y’aura erreur à l’exécution.
Pour l’exemple de la température maximale, la fonction Map s’écrit en Java, comme suit :
23
4.3.3. La fonction Reduce
La fonction Map est structuré selon le format suivant :
24
Pour l’exemple de la température maximale, la fonction Reduce s’écrit en Java, comme suit :
25
Un objet Job constitue la spécification du job et vous donne le contrôle sur la façon dont le job est
exécuté. Lorsque nous exécutons ce job sur un cluster Hadoop, nous le paquetons dans un fichier
JAR (que Hadoop distribuera au travers du cluster). Plutôt que de spécifier explicitement nom du
fichier JAR, nous pouvons passer une classe dans la méthode setJarByClass () du Job, que
Hadoop utilisera pour localiser le fichier JAR approprié en recherchant le fichier JAR contenant
cette classe.
Après avoir construit un objet Job, nous spécifions les chemins d'entrée et de sortie. Un chemin
d'entrée est spécifié en appelant la méthode statique addInputPath () sur FileInputFormat, et il
peut être un seul fichier, un répertoire (dans ce cas, l'entrée forme tous les fichiers dans ce
répertoire), ou un modèle de fichier. Comme son nom l'indique, addInputPath () peut être appelé
plus d'une fois pour utiliser des entrées provenant de plusieurs chemins.
26
Le chemin de sortie (dont il n'y en a qu'un) est spécifié par la static setOutputPath () méthode sur
FileOutputFormat. Il spécifie un répertoire où les fichiers de sortie du Reducer sont écrits. Le
répertoire ne doit pas exister avant d'exécuter le travail, car Hadoop ne va pas exécuter le travail.
Cette précaution vise à prévenir la perte de données.
Ensuite, nous spécifions les types du Mapper et du Reducer via setMapperClass () et Méthodes
setReducerClass ().
Les méthodes setOutputKeyClass () et setOutputValueClass () contrôlent les types de sortie pour
la fonction Reduce, et doit correspondre à ce que la classe Reduce produit. La sortie de la
fonction Map sont par défaut ceux de la fonction Reduce, ainsi si le Mapper produit le m^me type
de sorite que le Reducer, ils n’ont pas besoin d'être définis (comme c'est le cas ici ). Cependant,
s'ils sont différents, les types de sortie du Map doivent être définis à l'aide de
setMapOutputKeyClass () et Méthodes setMapOutputValueClass ().
Les types d'entrée sont contrôlés via le format d'entrée, que nous n'avons pas explicitement défini
parce que nous utilisons le TextInputFormat par défaut.
Après avoir défini les classes qui définissent les fonctions Map et Reduce, nous sommes prêts à
exécuter le job. La méthode waitForCompletion () sur Job soumet le travail et attend qu'il se
termine.
Le seul argument de la méthode est un drapeau indiquant si la sortie verbeuse est généré. Lorsque
la valeur est true, le travail écrit des informations sur sa progression dans la console.
La valeur de retour de la méthode waitForCompletion () est un booléen indiquant le succès (true)
ou failure (false), que nous traduisons par le code de sortie 0 ou 1 du programme.
Lancement du job:
$ export HADOOP_CLASSPATH=[Link]
$ hadoop MaxTemperature input/ncdc/[Link] output
27
Chapitre 5 :
Les bases de Données NoSQL
5. 1. Introduction
L’essor des très grandes plateformes et applications Web (Google, Facebook, Twitter, LinkedIn,
Amazon, …) et le volume considérable de données à gérer par ces applications nécessitant une
distribution des données et leur traitement sur de nombreux serveurs : « Data Centers » ; ces
données étant souvent associées à des objets complexes et hétérogène ont montré les limites des
SGBD traditionnels (relationnels et transactionnels) basés sur SQL.
Ainsi, de nouvelles approches de stockage et de gestion des données sont apparues, permettant
une meilleure scalabilité dans des contextes fortement distribués et offrant une gestion d’objets
complexes et hétérogènes sans avoir à déclarer au préalable l’ensemble des champs représentant
un objet.
Ces approches regroupées derrière le terme NoSQL (proposé par Carl Strozzi) ne se substituent
pas aux SGBD Relationnels mais les complètent en comblant leurs faiblesses (Not Only SQL).
30
« Document » : pour la gestion de collections de documents, composés chacun de champs et de
valeurs associées, valeurs pouvant être requêtées (adaptées au stockage de profils utilisateur).
MongoDBn, CouchDB, Couchbase, …
« Graphe » : pour gérer des relations multiples entre les objets (adaptés au données issues de
réseaux sociaux, …)
Neo4j, OrientDB, …
5.5. HBase
HBase est un système de stockage efficace pour des données très volumineuses. Il permet
d’accéder aux données très rapidement même quand elles sont gigantesques. Une variante de
HBase est notamment utilisée par FaceBook pour stocker tous les messages SMS, email et chat.
5.5.1. Présentation
HBase mémorise des n-uplets constitués de colonnes (champs). Les n-uplets sont identifiés par
une clé. À l’affichage, les colonnes d’un même n-uplet sont affichées successivement : Clés,
Colonnes et Valeurs.
isbn7615 colonne=auteur valeur="Jules Verne"
isbn7615 colonne=titre valeur="De la Terre à la Lune"
isbn7892 colonne=auteur valeur="Jules Verne"
isbn7892 colonne=titre valeur="Autour de la Lune"
31
Pour obtenir une grande efficacité, les données des tables HBase sont séparées en régions. Une
région contient un certain nombre de n-uplets contigus (un intervalle de clés successives).
Une nouvelle table est mise initialement dans une seule région. Lorsqu’elle dépasse une certaine
limite, elle se fait couper en deux régions au milieu de ses clés. Et ainsi de suite si les régions
deviennent trop grosses.
Chaque région est gérée par un Serveur de Région (Region Server). Ces serveurs sont distribués
sur le cluster, ex: un par machine. Un même serveur de région peut s’occuper de plusieurs
régions de la même table. Au final, les données sont stockées sur HDFS.
32
Les clés HBase sont constituées de n’importe quel tableau d’octets : chaîne, nombre. . . En fait,
c’est un point assez gênant quand on programme en Java avec HBase, on doit tout transformer en
tableaux d’octets : clés et valeurs. En Java, ça se fait par :
final byte[] octets = [Link](donnée);
Si on utilise le shell de HBase, alors la conversion des chaînes en octets et inversement est faite
implicitement.
Les n-uplets sont classés par ordre des clés et cet ordre est celui des octets. C’est donc l’ordre
lexicographique pour des chaînes et l’ordre des octets internes pour les nombres. Ces derniers
sont donc mal classés à cause de la représentation interne car le bit de poids fort vaut 1 pour les
nombres
négatifs ; -10 est rangé après 3.
Par exemple, si les clés sont composées de "client" concaténée à un numéro, le classement sera :
client1
client10
client11
client2
Client3
Il faudrait écrire tous les numéros sur le même nombre de chiffres.
Pour retrouver rapidement une valeur, il faut bien choisir les clés. Il est important que des
données connexes aient une clé très similaire.
Par exemple, on veut stocker des pages web. Si on indexe sur leur domaine, les pages vont être
rangées n’importe comment. La technique consiste à inverser le domaine, comme un package
Java.
URL URL inversé
[Link] [Link]
[Link] [Link]
[Link] [Link]
[Link] [Link]
[Link] [Link]
5.5.4. Exemple
On veut enregistrer les coordonnées et les achats de clients. On va construire une table contenant
trois familles:
33
La famille personne contiendra les informations de base:
colonnes personne:nom et personne:prenom
La famille coords contiendra l’adresse :
colonnes coords:rue, coords:ville, coords:cp, coords:pays
La famille achats contiendra les achats effectués :
colonnes achats:date, achats:montant, achats:idfacture
HBase autorise à dé-normaliser un schéma (redondance dans les informations) afin d’accéder aux
données plus rapidement.
34
Il y a plusieurs variantes selon ce qu’on veut supprimer, seulement une valeur, une cellule, ou
tout un n-uplet :
deleteall 'NOMTABLE', 'CLE', 'FAM:COLONNE', TIMESTAMP
deleteall 'NOMTABLE', 'CLE', 'FAM:COLONNE'
deleteall 'NOMTABLE', 'CLE'
35
OPCMP doit être l’un des opérateurs <, <=, =, !=, > ou >= (sans mettre de quotes
autour)
VAL est une constante qui doit valoir :
'binary:chaine' pour une chaîne telle quelle
'substring:chaine' pour une sous-chaîne
…
Exemple :
{ FILTER => "ValueFilter(=,'substring:univ-annaba')"}
Plusieurs filtres questionnent la clé, famille ou colonne d’une valeur :
RowFilter(OPCMP, VAL)
FamilyFilter(OPCMP, VAL)
QualifierFilter(OPCMP, VAL)
accepte les n-uplet dont la clé, famille, colonne correspond à la constante
SingleColumnValueFilter('fam','col',OPCMP,VAL)
garde les n-uplets dont la colonne 'fam:col' correspond à la constante. Ce filtre est utile pour
garder des n-uplets dont l’un des champs possède une valeur qui nous intéresse.
ValueFilter(OPCMP, VAL)
accepte les valeurs qui correspondent à la constante
36
Références et Webographie
R. Bruchez, Les bases de données NoSQL: Comprendre et mettre en œuvre, Eyrolles, 2013.
[Link]
[Link]
[Link]
37