Vous êtes sur la page 1sur 65

Gestion et analyse des Big

Data
Chapitre II: Hadoop, HDFS et
MapReduce
Dr. Saadi Leila
Plan de cours
❖Introduction Hadoop
❖Hadoop File System HDFS
❖Algorithme MapReduce
❖Yarn et MapReduce
❖Mise en œuvre dans Hadoop
❖Jobs MapReduce
❖Types des clés et valeurs
❖Efficacité
❖Entre Map et Reduce
❖MapReduce dans d’autres langages
❖Étude de cas MapReduce
Introduction Hadoop

▪ Selon LinkedIn, les compétences les plus recherchées depuis


plusieurs années sont (statistiques 2015) :
– 1) Cloud and Distributed Computing (Hadoop, Big Data)
– 2) Statistical Analysis and Data Mining (R, Data Analysis)
– 10) Storage Systems and Management (SQL)
▪ d’où les préfixes:
Introduction Hadoop
Mégadonnées
▪ Les mégadonnées ou Big Data sont des collections d’informations
qui auraient été considérées comme gigantesques, impossible à
stocker et à traiter, il y a une dizaine d’années.
– Internet : Google en 2015 : 10 Eo (10 milliards de Go),
Facebook en 2014 : 300 Po de données (300 millions de Go), 4
Po de nouvelles données par jour, Amazon : 1 Eo.
– BigScience : télescopes (1 Po/jour), CERN (500 To/jour, 140
Po de stockage), génome, environnement. . .
▪ Les informations sont très difficiles à trouver  La raison
est que tout est enregistré sans discernement, dans l’idée que
ça pourra être exploité. Certains prêchent pour que les données
collectées soient pertinentes (smart data) plutôt que
volumineuses.
Introduction Hadoop
Distribution de données et traitement
Le traitement d’aussi grandes quantités de données impose des
méthodes particulières. Un SGBD classique, même haut de gamme,
est dans l’incapacité de traiter autant d’informations.
– Répartir les données sur plusieurs machines (jusqu’à
plusieurs millions d’ordinateurs) dans des Data Centers
▪ système de fichiers spécial permettant de ne voir qu’un seul
espace pouvant contenir des fichiers gigantesques et/ou très
nombreux (HDFS),
▪ bases de données spécifiques (HBase, Cassandra,
ElasticSearch).
– Traitements du type « map-reduce » :
▪ algorithmes faciles à écrire,
▪ exécutions faciles à paralléliser.
Introduction Hadoop

▪ Un data center ou centre de données, est une infrastructure composée d’un


réseau d’ordinateurs et d’espaces de stockage. Cette infrastructure peut
être utilisée par les entreprises pour organiser, traiter, stocker et
entreposer de grandes quantités de données. (exemple: un cluster de 5000
ordinateurs)
▪ Serveur Lame: Chacun de ces PC lames (blade computer) ou rack server peut
ressembler à ceci (4 CPU multi-coeurs, 1 To de RAM, 24 To de disques
rapides, 5000e, prix et technologie en constante évolution). Exemple
Datacenter Google
▪ Toutes ces machines sont connectées entre elles afin de partager l’espace
de stockage et la puissance de calcul. Le Cloud est un exemple d’espace de
stockage distribué : des fichiers sont stockés sur différentes machines,
généralement en double pour prévenir une panne. L’exécution des programmes
est également distribuée : ils sont exécutés sur une ou plusieurs machines
du réseau.
Introduction Hadoop

▪ Définition de Apache: The Apache Hadoop project develops


open source software for reliable, scalable, distributed
computing.
La bibliothèque de logiciels Apache Hadoop est une plateforme
qui permet le traitement distribué de grands ensembles de
données sur des clusters d'ordinateurs à l'aide de modèles de
programmation simples. Il est conçu pour passer de serveurs
uniques à des milliers de machines, chacune offrant un calcul
et un stockage local. Plutôt que de s'appuyer sur du matériel
pour offrir une haute disponibilité, la bibliothèque elle-même
est conçue pour détecter et gérer les pannes au niveau de la
couche application, offrant ainsi un service hautement
disponible sur un cluster d'ordinateurs, chacun pouvant être
sujet à des pannes.
Introduction Hadoop
▪ À 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.
Introduction Hadoop
Hadoop assure les critères des solutions Big Data à savoir:
▪ Performance: support du traitement d'énormes data sets (millions
de fichiers, Go à To de données totales) en exploitant le
parallélisme et la mémoire au sein des clusters de calcul.
▪ Economie: contrôle des coûts en utilisant des matériels de
calcul de type standard.
▪ Evolutivité (scalabilité): un plus grand cluster devrait donner
une meilleure performance.
▪ Tolérance aux pannes: la défaillance d'un nœud ne provoque pas
l'échec de calcul.
▪ Parallélisme de données: le même calcul effectué sur toutes les
données.
Introduction Hadoop

▪ Les composants fondamentales de


Hadoop sont:
Plus concrètement Hadoop est
constitué de plusieurs composants
couvrant le stockage et la
répartition des données, les
traitements distribués, l'entrepôt
de données, le workflow, la
programmation, sans oublier la
coordination de l'ensemble des
composants.
Introduction Hadoop

▪ HDFS (Hadoop Distributed File System) est le système


de stockage primaire utilisé par les applications
Hadoop. HDFS permet de gérer la réplication de
multiples blocs de données et leur distribution sur
les nœuds de calcul à travers un cluster pour
permettre des calculs fiables et extrêmement rapides.
▪ MapReduce est une plate-forme de programmation conçue
pour écrire des applications permettant le traitement
rapide et parallélisé de vastes quantités de données
réparties sur plusieurs clusters de nœuds de calcul.
▪ HBase est un système de gestion de base de données non
relationnelle, distribuée et orientée colonnes,
prenant pour modèle Big Table de Google.
Introduction Hadoop

▪ HCatalog est une couche de métalangage permettant


d'attaquer les données HDFS via des schémas de type
tables de données en lecture/écriture.
▪ Hive est un système d'entrepôt de données facilitant
l'agrégation des données, les requêtes ad hoc, et
l'analyse de grands ensembles de données stockées dans
les systèmes de fichiers compatibles Hadoop. Hive
dispose d'un langage de type SQL appelé HiveQL.
▪ Pig est une plate-forme d'analyse de vastes ensembles
de données. Pig comprend un langage de haut niveau
gérant la parallélisation des traitements d'analyse.
Introduction Hadoop

▪ Oozie est un outil de workflow dont l'objectif est de simplifier la


coordination et la séquence de différents traitements. Le système
permet aux utilisateurs de définir des actions et les dépendances
entre ces actions.
▪ ZooKeeper est un service centralisé pour gérer les informations de
configuration, de nommage, et assurer la synchronisation des
différents serveurs via un cluster. Tous les services pris en
charge par ZooKeeper peuvent être utilisés sous une forme ou une
autre par les applications distribuées.
▪ YARN est un système permettant de gérer des applications
distribuées. Il est composé d’un Gestionnaire de Ressource central
qui arbitre entre toutes les ressources en cluster disponibles et
d’un gestionnaire de nœud par nœud qui est orienté par gestionnaire
de ressource et est référent de la gestion des ressources
disponibles dans un nœud isolé.
Introduction Hadoop
▪ Mahout L’objectif de Mahout est de construire des bibliothèques
évolutives d'apprentissage automatique s'adaptant à des
ensembles de données assez grands. Les algorithmes de base pour
le clustering, la classification et les lots basés sur le
filtrage collaboratif sont mises en œuvre sur Apache Hadoop
avec l'aide du paradigme MapReduce.
▪ Sqoop a été conçu pour transférer rapidement des milliards de
lignes dans Hadoop grâce à une technologie basée sur des
fonctions parallèles place les données, soit directement dans
un espace de géré par le système Hadoop Distributed File
(HDFS), ou peut les orienter vers d'autres applications Hadoop
comme le système de gestion de base de données non
relationnelle distribuée HBase et son stockage structuré pour
les grandes tables, ou le logiciel d'analyse de données Hive de
Hadoop.
Introduction Hadoop

▪ Kafka est un système


distribué de communication
inter-processus de type
publication-abonnement
(publish-subscribe) qui
est souvent utilisé avec
Hadoop pour accélérer les
transferts de données. Un
cluster Kafka est
constitué d'un groupe de
serveurs qui servent
d'intermédiaires entre les
Producers et les Consumers.
Introduction Hadoop
Introduction Hadoop
Hadoop File System HDFS
Présentation

▪ A cause de sa capacité massive et sa fiabilité, HDFS est un système de


stockage très adapté au Big Data. En combinaison avec YARN, ce système
augmente les possibilités de gestion de données du cluster HDFS Hadoop et
permet donc de traiter le Big Data efficacement. Parmi ses principales
fonctionnalités, on compte la possibilité de stocker des terabytes, voire des
petabytes de données.
▪ HDFS est un système de fichiers distribué. C’est à dire :
– les fichiers et dossiers sont organisés en arbre (comme Unix)
– ces fichiers sont stockés sur un grand nombre de machines de manière à
rendre invisible la position exacte d’un fichier. L’accès est transparent,
quelle que soient les machines qui contiennent les fichiers.
– les fichiers sont copiés en plusieurs exemplaires pour la fiabilité et
permettre des accès simultanés multiples
▪ HDFS permet de voir tous les dossiers et fichiers de ces milliers de machines
comme un seul arbre, contenant des Po de données, comme s’ils étaient sur le
disque dur local.
Hadoop File System HDFS
Présentation

▪ Le système est capable de gérer des milliers de nœuds sans


intervention d’un opérateur. Il permet de bénéficier simultanément
des avantages du calcul parallèle et du calcul distribué. Après une
modification, il permet de restaurer facilement la précédente
version d’une donnée.
▪ HDFS peut être lancé sur commodity hardware, ce qui le rend très
tolérant aux erreurs. Chaque donnée est stockée à plusieurs
endroits, et peut donc être récupérée en toutes circonstances. De
même, cette réplication permet de lutter contre la corruption
potentielle des données.
▪ Les serveurs sont connectés et communiquent par le biais de
protocoles TCP. Même s’il est conçu pour les bases de données
massives, les systèmes de fichiers normaux comme FAT et NTFS sont
également compatibles. Enfin, une fonctionnalité CheckpointNode
permet de vérifier le statut des nœuds en temps réel.
Hadoop File System HDFS
Organisation des fichiers

▪ Vu de l’utilisateur, HDFS ressemble à un système de fichiers Unix :


il y a une racine, des répertoires et des fichiers. Les fichiers
ont un propriétaire, un groupe et des droits d’accès comme avec
ext4.
▪ Sous la racine /, il y a :
– des répertoires pour les services Hadoop : /hbase, /tmp, /var
– un répertoire pour les fichiers personnels des utilisateurs :
/user (attention, ce n’est ni /home, ni /users comme sur d’autres
systèmes Unix). Dans ce répertoire, il y a aussi trois dossiers
système : /user/hive, /user/history et /user/spark.
– un répertoire pour déposer des fichiers à partager avec tous les
utilisateurs : /share
▪ Vous devrez distinguer les fichiers HDFS des fichiers « normaux ».
Hadoop File System HDFS
Fonctionnement
Hadoop File System HDFS
Fonctionnement

▪ Dans un cluster, où les données et les services sont


stockées sur plusieurs machines différentes, HDFS
fonctionne selon un principe maître/esclaves classique :
les données y sont stockées sur les datanodes (esclaves)
tandis que les localisations des blocs de données sont
répertoriées par le namenode (maître).
▪ Chaque fichier est décomposé en blocs de taille maximale
fixe. Par défaut, cette taille est de 64 Mo. Par exemple,
un fichier de 150 Mo va être décomposé en trois blocs :
deux blocs de 64 Mo et un bloc de 22 Mo. Ces blocs seront
répartis de manière redondante sur les différents data
nodes. C'est le namenode qui sait comment sont décomposés
les fichiers et sur quels datanodes sont stockés ces blocs.
Hadoop File System HDFS
Fonctionnement

▪ Remarque:
Cette décomposition de fichiers en blocs permet à
HDFS de stocker des fichiers de taille arbitrairement
grande. Alors que dans les systèmes de fichiers non
distribués la taille des fichiers est limitée par le
nombre de bits utilisés pour indexer chacun des
segments (4 Go pour FAT32, 16 To pour NTFS, 2 To à 8
Eo pour HFS+), dans HDFS la limite théorique est de
512 Yo (512x10¹² To). Quant au nombre maximum de
fichiers par répertoire.
Hadoop File System HDFS
Fonctionnement

▪ En fait, les datanodes ont très peu d'intelligence et


ils ne servent qu'à stocker les données. Les adresses
des blocs ainsi que les noms des fichiers sont tous
stockés par le namenode, dont le rôle est critique.
Hadoop File System HDFS
Fonctionnement

▪ Un cluster HDFS est constitué de machines jouant différents rôles exclusifs entre eux:
– L’une des machines est le maître HDFS, appelé le namenode. Cette machine contient tous les noms et
blocs des fichiers, comme un gros annuaire téléphonique.
– Une autre machine est le secondary namenode, une sorte de namenode de secours, qui enregistre des
sauvegardes de l’annuaire à intervalles réguliers.
– Certaines machines sont des clients. Ce sont des points d’accès au cluster pour s’y connecter et
travailler.
– Toutes les autres machines sont des datanodes. Elles stockent les blocs du contenu des fichiers.
Hadoop File System HDFS
Fonctionnement

▪ Les datanodes contiennent des blocs, le namenode sait où sont les


fichiers: quels blocs et quels datanodes.
▪ Les datanodes contiennent des blocs. Les mêmes blocs sont dupliqués
(replication) sur différents datanodes, en général 3 fois. Cela assure:
▪ fiabilité des données en cas de panne d’un datanode,
▪ accès parallèle par différents processus aux mêmes données.
Le namenode sait à la fois :
▪ sur quels blocs sont contenus les fichiers,
▪ sur quels datanodes se trouvent les blocs voulus.
▪ On appelle cela les metadata.
▪ Inconvénient majeur : panne du namenode = mort de HDFS, c’est pour
éviter ça qu’il y a le secondary namenode. Il archive les metadata, par
exemple toutes les heures.
Hadoop File System HDFS
Commande hdfs dfs

▪ La commande hdfs dfs et ses options permet de gérer les fichiers et dossiers :
– hdfs dfs -help
– hdfs dfs -ls [noms...] (pas d’option -l)
– hdfs dfs -cat nom
– hdfs dfs -mv ancien nouveau
– hdfs dfs -cp ancien nouveau
– hdfs dfs -mkdir dossier
– hdfs dfs -rm -f -r dossier (pas d’option -fr)
– hdfs dfs –tail <Path[filename]> afficher les dernières lignes d’un fichier

Il faut toutefois noter que les commandes mettent un certain temps à réagir, voir cette
page: ce sont des logiciels écrits en Java avec chargement de très nombreux jars.

D’autre part, nos machines ne sont pas très rapides.

▪ Pour placer un fichier dans HDFS, deux commandes équivalentes:


– hdfs dfs -copyFromLocal fichiersrc fichierdst
– hdfs dfs -put fichiersrc [fichierdst]

▪ Pour extraire un fichier de HDFS, deux commandes possibles:


– hdfs dfs -copyToLocal fichiersrc dst
– hdfs dfs -get fichiersrc [fichierdst]
Hadoop File System HDFS
API Java pour HDFS

Hadoop propose une API Java complète pour accéder aux fichiers de HDFS. Elle
repose sur deux classes principales :
▪ FileSystem représente l’arbre des fichiers (file system). Cette classe
permet de copier des fichiers locaux vers HDFS (et inversement), renommer,
créer et supprimer des fichiers et des dossiers
▪ FileStatus gère les informations d’un fichier ou dossier :
– taille avec getLen(),
– nature avec isDirectory() et isFile(),
Ces deux classes ont besoin de connaître la configuration du cluster HDFS, à
l’aide de la classe Configuration. D’autre part, les noms complets des
fichiers sont représentés par la classe Path
Hadoop File System HDFS
API Java pour HDFS

▪ Exemple:
Hadoop File System HDFS
API Java pour HDFS

▪ Afficher la liste des blocs d’un fichiers


Hadoop File System HDFS
API Java pour HDFS

▪ Lecture d’un fichier texte:


Hadoop File System HDFS
API Java pour HDFS

▪ Création d’un fichier HDFS


Hadoop File System HDFS
API Java pour HDFS

▪ Compilation et lancement
Algorithme MapReduce
Présentation
▪ Le modèle de programmation MapReduce est l’un des principaux
composants du framework Hadoop. Il est utilisé pour accéder
aux données Big Data stockées au sein du Hadoop File System
(HDFS).
▪ L’intérêt de MapReduce est de faciliter le traitement
concurrent des données. Pour parvenir à cette prouesse, les
volumes massifs de données, de l’ordre de plusieurs
petabytes, sont décomposés en plusieurs parties de moindres
envergures.
▪ Ces morceaux de données sont traités en parallèle, sur les
serveurs Hadoop. Après le traitement, les données en
provenance des multiples serveurs sont agrégées pour renvoyer
un résultat consolidé à l’application.
▪ Hadoop est capable d’exécuter des programmes MapReduce écrits
dans divers langages : Java, Ruby, Python, C++…
Algorithme MapReduce
Présentation
▪ Le fonctionnement de MapReduce s’articule principalement
autour de deux fonctions : Map, et Reduce. Pour faire
simple, Map sert à décomposer et à cartographier les
données. Reduce mélange et réduit les données.
▪ Ces fonctions sont séquencées l’une après l’autre. Pour
désigner les serveurs exécutant les fonctions Map et
Reduce, on utilise les termes de Mappers et Reducers. Il
peut toutefois s’agir des mêmes serveurs.
▪ Exemple: Soient les 4 tuples suivants :
Algorithme MapReduce
Présentation

▪ Calculer le prix maximal, moyen ou total peut s’écrire à l’aide


d’algorithmes

pour chaque tuples, faire :

valeur = FonctionM(tuple courant)

retourner FonctionR(valeurs rencontrées)

▪ FonctionM est une fonction de correspondance : elle calcule une


valeur qui nous intéresse à partir d’un tuple,

▪ FonctionR est une fonction de regroupement (agrégation) : maximum,


somme, nombre, moyenne, distincts. . .
Algorithme MapReduce
Présentation

▪ Par exemple, FonctionM extrait le prix d’une voiture, FonctionR


calcule le max d’un ensemble de valeurs :
pour chaque voiture, faire :
prix = getPrix(voiture courante)
retourner max(prix rencontrés)
Algorithme MapReduce
Présentation

▪ L’écriture map(fonction, liste) applique la fonction à chaque


élément de la liste. Elle effectue la boucle « pour » de
l’algorithme précédent et retourne la liste des prix des voitures.
Ce résultat contient autant de valeurs que dans la liste d’entrée.
▪ La fonction reduce(fonction, liste) agglomère les valeurs de la
liste par la fonction et elle retourne le résultat final
▪ Ces deux fonctions constituent un couple « map-reduce ».
▪ Le point clé est la possibilité de paralléliser ces fonctions afin
de calculer beaucoup plus vite sur une machine ayant plusieurs cœurs
ou sur un ensemble de machines reliées entre elles.
Algorithme MapReduce
Présentation
Algorithme MapReduce
La fonction Map

▪ Les données d’input sont décomposées en blocs de moindre


envergure. Chacun de ces blocs est assigné à un » mapper » pour
le traitement.
▪ Prenons l’exemple d’un fichier contenant 100 enregistrements à
traiter. Il est possible d’utiliser 100 mappers simultanément pour
traiter chaque enregistrement séparément. Toutefois, on peut aussi
confier plusieurs enregistrements à chaque mapper.
▪ En réalité, le framework Hadoop se charge de décider
automatiquement combien de mappers utiliser. Ce choix dépend de la
taille des données à traiter et des blocs de mémoire disponibles
sur chaque serveur.
▪ La fonction Map reçoit l’input à partir du disque sous forme de
paires « clé/valeur » . Ces paires sont traitées, et un autre
ensemble de clé/valeur intermédiaire est produit.
Algorithme MapReduce
La fonction Reduce

▪ Après que tous les mappers aient terminé leurs tâches de


traitement, le framework mélange et organise les résultats. Il
les transmet ensuite aux « reducers » . Précisons qu’un
reducer ne peut démarrer si un mapper est encore actif.
▪ La fonction Reduce reçoit aussi les inputs sous forme de
paires clé/valeur. Toutes les valeurs produites par map ayant
la même clé sont assignées à un reducer unique. Celui-ci se
charge d’agréger les valeurs pour cette clé. Reduce produit
ensuite un ouput final, toujours sous forme de paie
clé/valeur.
▪ Toutefois, le type de clés et de valeurs varie selon les cas
d’usage. Tous les inputs et outputs sont stockés dans le HDFS.
Précisons que la fonction map est impérative pour filtrer et
trier les données initiales. En revanche, la fonction reduce
est optionnelle.
Algorithme MapReduce
Combiner et partitionner
▪ Il existe deux étapes intermédiaires entre Map et Reduce. Ces deux étapes
sont appelées Combine et Partition.
▪ Le processus Combine est optionnel. Un « combiner » est un « reducer »
exécuté individuellement sur chaque serveur « mapper » . Il permet de
réduire davantage les données sur chaque mapper, dans une forme simplifiée.
Ceci permet de simplifier le shuffling et l’organisation, puisque le volume
de données à organiser est réduit.
▪ L’étape de Partition permet quant à elle de traduire les paires « clé
valeur » produites par les mappers en un autre ensemble de paires clé
valeur avant de les transmettre au reducer. Ce processus décide comment les
données doivent être présentées au reducer et les assignent à un reducer
spécifique.
▪ Le partionneur par défaut détermine la valeur « hash » pour la clé
produite par le mapper, et lui assigne une partition en fonction de cette
valeur. Le nombre de partitions est égal au nombre de reducers. Dès que le
partitionnement est complet, les données en provenance de chaque partition
sont envoyées à un reducer spécifique.
Algorithme MapReduce
Exemple

▪ Pour bien comprendre comment fonctionne MapReduce, essayons de


dérouler le fonctionnement de l'algorithme sur un exemple de
comptage de mots, notamment dans un environnement Hadoop.
▪ On dispose d'un corpus de mots, c'est-à-dire que chaque valeur des
données d'entrée est une chaîne de caractères (un mot). Comment
allons-nous appliquer MapReduce sur ce cas précis ?
Étape Map (InputSplitter et Mapper)
▪ Premièrement, un InputSplitter va se charger de décomposer le
corpus sous forme d'une liste de mots. Ainsi, nous appliquerons
le Mapper sur chaque mot.
▪ Pour ce Mapper, nous choisissons la fonction w↦(w,1), c'est-à-dire
que l'on considère le mot comme étant la clé, et la valeur comme
étant le comptage. Cette opération attribue 1 ici puisqu'en
appliquant le Mapper, on parcourt une et une seule fois tous les
mots du corpus : nous observons donc chaque mot une fois.
Algorithme MapReduce
Exemple
Algorithme MapReduce
Exemple

Étape Reduce (Combiner et Shuffling)


C'est à partir de là que l'on regroupe les paires. Le Combiner a pour
rôle de regrouper toutes les valeurs d'une seule et même clé. Ainsi, dans
le premier bloc (pointillé noir), il y a eu 5 fois la paire (chat, 1) .
En regroupant les valeurs, le Combiner produit une paire unique (chat, [1, 1,
1, 1, 1]) .
Ensuite, c'est le Shuffling qui va rapatrier chaque paire unique clé-
valeur des blocs et agréger toutes les valeurs. C'est à nous de définir
cette agrégation : doit-on prendre la somme, le minimum, le maximum ?
Puisque l'on souhaite compter le nombre mots, en prenant la somme,
on dénombre les valeurs qui appartiennent à cette clé.
Autrement dit, nous allons calculer combien de fois le mot chat est
apparu. Au final, nous avons un résultat agrégé, où chaque clé est un
mot unique, et chaque valeur son nombre d'occurrences.
Algorithme MapReduce
Exemple
Algorithme MapReduce
Les avantages

• Il est adapté pour le fonctionnement par clusters. Par définition,


les étapes de Map et Reduce sont effectués sous forme de groupes
isolés les uns des autres, ce qui est le cas dans un cluster de
serveurs, où chaque serveur est indépendant des autres.
• La volumétrie des données n'impacte pas les transformations
appliquées. Contrairement à d'autres systèmes (SQL par exemple) où
il faut adapter le calcul à la taille des données, il n'y a pas
besoin de changer les calculs. Cette flexibilité permet donc
d'écrire des scripts qui pourront s'exécuter quelle que soit la
taille des données.
• La vitesse d'exécution est optimisée. En effet, grâce au système de
fichiers distribués HDFS, les données sont fragmentées sur les
différents serveurs. Les transformations sont décomposées sous
forme d'étapes, ce qui permet de traiter en parallèle des briques
d'opérations sur chaque serveur du cluster.
• Il s'intègre parfaitement dans l'écosystème Hadoop. De nombreux
outils tels que Hive, HBase ou encore Pig utilisent MapReduce pour
chaque traitement distribué.
Algorithme MapReduce
Paires clé-valeurs

C’est en fait un peu plus compliqué que ce qui a été expliqué


initialement. Les données échangées entre Map et Reduce, et
plus encore, dans la totalité du job sont des paires (clé,
valeur) :
– une clé : c’est n’importe quel type de données : entier,
texte. . .
– une valeur : c’est n’importe quel type de données
▪ Tout est représenté ainsi. Par exemple :
– un fichier texte est un ensemble de (n° de ligne, ligne).
– un fichier météo est un ensemble de (date et heure,
température)
C’est cette notion qui rend les programmes assez étranges au
début : les deux fonctions Map et Reduce reçoivent des paires
(clé, valeur) et émettent d’autres paires, selon les besoins de
l’algorithme.
Algorithme MapReduce
Paires clé-valeurs

▪ Map
Cette spécification très peu contrainte permet de
nombreuses choses. En général, les paires que
reçoit Map sont constituées ainsi :
▪ la valeur de type text est l’une des lignes ou
l’un des n-uplets du fichier à traiter
▪ la clé de type integer est la position de cette
ligne dans le fichier (on l’appelle offset en bon
▪ français)
Il faut comprendre que YARN lance une instance de
Map pour chaque ligne de chaque fichier des données
à traiter. Chaque instance traite la ligne qu’on
lui a attribuée et produit des paires en sortie.
Algorithme MapReduce
Paires clé-valeurs

▪ Reduce
YARN lance une instance de Reduce pour
chaque clé différente que les instances de
Map ont produit, et leur fournit
uniquement les paires ayant la même clé.
C’est ce qui permet d’agréger les valeurs.
En général, Reduce doit faire un
traitement sur les valeurs, comme
additionner toutes les valeurs entre
elles, ou déterminer la plus grande des
valeurs. . .
Quand on conçoit un traitement MapReduce,
on doit réfléchir aux clés et valeurs
nécessaires pour que ça marche.
MapReduce et YARN
▪ Les initiales YARN désignent le terme « Yet Another Resource
Negotiator » , un nom donné avec humour par les développeurs. Cette
technologie est devenue un sous-projet de Apache Hadoop en 2012, et a
été ajoutée comme une fonctionnalité clé de Hadoop avec la mise à
jour 2.0 déployée en 2013.
▪ Avant l’ajout de YARN, Hadoop ne pouvait exécuter que des
applications MapReduce. YARN a donc beaucoup augmenté les cas d’usage
potentiels du framework. En découplant la gestion des ressources et
la planification du composant de traitement de données de MapReduce,
YARN a également permis à Hadoop de prendre en charge davantage
d’applications et de types de traitement différents.
▪ Par exemple, les clusters Hadoop sont maintenant en mesure de lancer
des applications d’analyse en temps réel, de streaming data et
requêtes interactives sur Apache Spark tout en laissant tourner
MapReduce.
MapReduce et YARN
▪ YARN combine un gestionnaire de ressources centrale avec des
containers, des coordinateurs d’application et des agents chargés de
surveiller les opérations de traitement des différents noeuds de
clusters. YARN est en mesure d’allouer les ressources aux
applications de façon dynamique en fonction de leurs besoins.
▪ Ce composant d’Hadoop propose par ailleurs plusieurs méthodes de
planification : FIFO Scheduler, Fair Scheduler, ou encore Capacity
Scheduler. En outre, la fonctionnalité Reservation System permet aux
utilisateurs de réserver des ressources de cluster en avance afin de
s’assurer que les tâches de traitement importantes soient exécutées
sans encombre.
▪ Une autre fonctionnalité notable, ajoutée avec Hadoop 3.0, est YARN
Federation. Celle-ci permet d’augmenter le nombre de noeuds qu’une
seule implémentation de YARN peut prendre en charge en connectant
différents » subclusters » équipés de leurs propres managers de
ressources.
MapReduce et YARN
▪ YARN est constitué de plusieurs composants principaux. Le gestionnaire
de ressources global (ResourceManager) a pour rôle d’accepter les
tâches soumises par les utilisateurs, de programmer les tâches et de
leur allouer des ressources.
▪ Sur chaque noeud, on retrouve un NodeManager dont le rôle de surveiller
et de rapporter au ResourceManager. On retrouve par ailleurs un
ApplicationMaster, créé pour chaque application, chargé de négocier les
ressources et de travailler conjointement avec le NodeManager pour
exécuter et surveiller les tâches.
▪ Enfin, les containers de ressources sont contrôlés par les NodeManagers
et assigne les ressources allouées aux applications individuelles.
Généralement, les containers YARN sont organisés en noeuds et
programmés pour exécuter des tâches uniquement si des ressources sont
disponibles pour ce faire. Sous Hadoop 3.0, il est toutefois possible
de créer des » containers opportunistes » pouvant être placés en
attente jusqu’à ce que des ressources soient libérées. Ce concept
permet d’optimiser l’usage des ressources.
Mise en œuvre dans Hadoop

On arrive à la partie la plus technique : la programmation d’un


job MapReduce en Java. Il faut définir trois classes :
▪ Une sous-classe de Mapper. Elle contient une seule méthode,
appelée map qui reçoit une paire clé-valeur en paramètre. Elle
génère un nombre quelconque de paires.
▪ Une sous-classe de Reducer. Elle contient également une seule
méthode, appelée reduce qui reçoit une liste de paires en
paramètre. Elle génère une seule paire.
▪ Une classe générale qui crée un Job faisant référence aux deux
précédentes classes.
Les deux premières sont des patrons (templates) paramétrées par
les types des clés et des valeurs.
Mise en œuvre dans Hadoop
Le Mapper
Mise en œuvre dans Hadoop
Les types de données MapReduce

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);
val.set(35);
▪ un accesseur : type get()
int v = val.get();
Mise en œuvre dans Hadoop
Interface Writable

▪ Elle 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. Cela fait partie de la technique
appelée Remote Procedure Call (RPC). 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. . .
▪ Cette interface n’est pas limitée à des types simples
mais peut gérer des collections (tableaux, listes,
dictionnaires. . . ) et classes.
Mise en œuvre dans Hadoop
Classe Text

▪ La classe Text permet de représenter n’importe quelle


chaîne. Elle possède quelques méthodes à connaître :
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
▪ Ces méthodes ne sont pas suffisantes. Il faudra souvent
convertir les Text en chaînes.
Mise en œuvre dans Hadoop
Reducer
Mise en œuvre dans Hadoop
Reducer

▪ 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. . .
▪ Une chose cruciale n’est pas du tout vérifiée par Java : 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 passera à la compilation mais
plantera à l’exécution.
Mise en œuvre dans Hadoop
Traitement
Mise en œuvre dans Hadoop
Traitement (run)
Mise en œuvre dans Hadoop
Traitement (run)

La méthode run est chargée de créer et lancer un Job. Il faut


noter que la spécification Hadoop a beaucoup changé depuis les
premières versions. Il faut actuellement faire ainsi :
▪ Obtenir une instance de Configuration. Elle contient les
options telles que les formats des fichiers, leur nom HDFS
complet, leur codec de compression. . . voir le prochain cours.
▪ Créer un Job, lui indiquer les classes concernées : mapper et
reducer.
▪ Fournir les noms complets des fichiers à traiter et à produire.
▪ Indiquer les types des clés et valeurs. Par défaut, ce sont des
Text.
▪ Attendre la fin du job et retourner un code d’erreur.
Mise en œuvre dans Hadoop
Compilation et lancement de traitement
▪ Compilation
hadoop com.sun.tools.javac.Main Traitement*.java
▪ Emballage dans un fichier jar. NB: c’est plus compliqué quand il y a
des packages.
jar cfe Traitement.jar Traitement Traitement*.class
▪ Préparation : mettre en place les fichiers à traiter, supprimer le
dossier de sortie
hdfs dfs -rm -r -f sortie
▪ Lancement
yarn jar Traitement.jar entree sortie
▪ Résultats dans le dossier sortie

Vous aimerez peut-être aussi