Par Maxime Jumelle
CTO & Co-Founder
Publié le 24 janv. 2022
Catégorie Data Engineering
MapReduce est un patron d'architecture de programmation utilisé pour paralléliser des calculs dans un contexte Big Data. Imaginé et développé par Jeff Dean chez Google, il a été repris dans plusieurs projet, dont le très populaire framework Hadoop qui utilise MapReduce.
Au fil des ans, ce modèle est devenu incontournable pour traiter de très grandes quantités de données. Son modèle, particulièrement robuste, permet d'adapter les calculs à n'importe quelle volumétrie de données, de quelques giga-octets jusqu'à des dizaines de tera-octets de données. En bref, il n'y a pas de limite (si ce n'est le temps de calcul) aux applications de MapReduce.
Puisqu'il s'agit d'une architecture de programmation, MapReduce peut être utilisée dans de nombreux langages de programmation : Java, Scala, R, Python, C++, etc.
Il est principalement utilisé avec le framework Hadoop, car ce dernier gère le fonctionnement de clusters. À l'intérieur de celui-ci, on retrouve des noeuds.
C'est en effet très important, puisque la particularité de MapReduce est de pouvoir traiter des données en parallèle. Lorsque le traitement est effectué, les données en provenance des multiples serveurs du cluster sont récupérés et agrégés pour obtenir un résultat final.
Profitant également de l'écosystème Hadoop, MapReduce utilise le système de fichiers distribués HDFS, ce qui permet à chaque serveur du cluster de lire et écrire des données basés sur des disques. Chaque fichier est donc accessible par n'importe quel noeud du cluster, ce qui permet d'exécuter un job indépendamment des autres.
Ainsi, par son fonctionnement, MapReduce va avoir la capacité de traiter une volumétrie importante, à la fois parce qu'il dispose de plusieurs serveurs dans un cluster, et que chacun de ces serveur utilise un même système de fichiers.
Comme son nom l'indique, MapReduce est constituée de deux étapes : une première appelée Map, et une seconde appelée Reduce. Ces deux étapes sont importantes, car elles permettent de transposer de nombreux opérations dans un cadre distribué.
L'étape Map va projeter les éléments d’une liste dans une nouvelle liste par l’intermédiaire d’une fonction \(f\) que l'on définit nous-même. Les données en entrée (input) vont être décomposées sous forme de plusieurs blocs de même tailles et envoyés vers différents workers (noeud du cluster qui exécute les calculs).
Chaque donnée des blocs est « mappé » à partir de la fonction \(f\) : son objectif est d'ajouter des informations supplémentaires de sorte à pouvoir créer des groupes de données, bien que celles-ci soient dispersées sur plusieurs serveurs.
Supposons que l'on ait des valeurs v1, v2, v3, v4
et que l'on souhaite regrouper des valeurs entre-elles. Par exemple, on peut supposer que v1, v4
appartiennent à un premier groupe, et v2, v3
à un deuxième groupe. Nous allons alors mapper chaque valeur initiale des blocs vers une paire clé-valeur : la clé indique le groupe auquel la valeur appartient. On obtiendrait alors (k1, v1), (k1, v4)
et (k2, v2), (k2, v3)
.
Le principal avantage de cette représentation est de pouvoir dire que des valeurs appartiennent au même groupe, même si elles se retrouvent dans des blocs différents, et donc sur des serveurs différents.
Maintenant que l'on dispose de paires clé-valeur, l'étape Reduce cherche à agréger les valeurs qui possèdent la même clé.
Dans cette étape, nous définissons une stratégie d'agrégation, c'est-à-dire une manière dont nous allons agréger toutes les valeurs pour une même clé. MapReduce va se charger lui-même de déterminer quelles sont les clés identiques et quelles sont les valeurs qui appartiennent au même groupe.
Si l'on reprends les paires précédentes, alors le regroupement des paires donnerait (k1, [v1, v4])
et (k2, [v2, v3])
. À partir de là, il est très facile d'agréger chaque liste : on peut faire une somme, un opération mathématique ou tout autre fonctions, libre à nous de la définir.
C'est notamment ce procédé qui permet de créer un lien entre des données situées sur des serveurs différents, alors même que ces derniers sont indépendants. Nous sommes ainsi capable de regrouper des données en utilisant les clés des paires.
Ce qui est crucial dans MapReduce, c'est de choisir les bonnes fonctions Mapper et Reducer à utiliser pour répondre précisément au besoin.
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 ?
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 \mapsto (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.
Potentiellement, chaque paire clé-valeur se trouve sur un serveur, et il peut très bien y avoir plusieurs fois la paire clé-valeur (chat, 1)
sur des serveurs différents.
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.
MapReduce possède de nombreux avantages, car il s'adapte à des situations différentes.
Néanmoins, pour certains cas d'usage, notamment lorsque les données sont hétérogènes, ce processus peut s'avérer particulièrement long à s'exécuter. Aujourd'hui, on utilise majoritairement Apache Spark, qui est à la fois plus rapide en terme d'exécution et plus facile à manipuler grâce à ses API proposées.
L'architecture MapReduce est très souvent employée par les Data Engineers qui souhaitent paralléliser des calculs. Bien que des API dites haut-niveau permettent d'effectuer des opérations de type SQL sur des données structurées, MapReduce reste un paradigme puissant qui peut s'avérer nécessaire dans certaines situations, notamment en présence de données non structurées.
La formation Data Engineer de Blent propose de nombreux cas d'usage pour maîtriser l'utilisation de MapReduce sous Hadoop dans des contextes variées, que ce soit sur des données non structurées ou pour du Data Mining. MapReduce sert également d'introduction aux modèles d'architecture plus simples d'utilisation.
Ce parcours de formation aborde également de nombreuses notions liées au traitement Big Data d'Hadoop avec l'utilisation de clusters Spark, la diffusion de données en temps réel avec Apache Kafka, l'automatisation de workflows et de pipelines avec Airflow ou encore le déploiement de modèles de Machine Learning.
Vous souhaitez vous former au Data Engineering ?
Articles similaires
7 févr. 2024
Pendant de nombreuses années, le rôle des Data Engineers était de récupérer des données issues de différentes sources, systèmes de stockage et applications tierces et de les centraliser dans un Data Warehouse, dans le but de pouvoir obtenir une vision complète et organisée des données disponibles.
Maxime Jumelle
CTO & Co-Founder
Lire l'article
4 déc. 2023
Pour de nombreuses entreprises, la mise en place et la maintenant de pipelines de données est une étape cruciale pour avoir à disposition d'une vue d'ensemble nette de toutes les données à disposition. Un des challenges quotidien pour les Data Analysts et Data Engineers consiste à s'assurer que ces pipelines de données puissent répondre aux besoins de toutes les équipes d'une entreprise.
Maxime Jumelle
CTO & Co-Founder
Lire l'article
14 nov. 2023
Pour améliorer les opérations commerciales et maintenir la compétitivité, il est essentiel de gérer efficacement les données en entreprise. Cependant, la diversité des sources de données, leur complexité croissante et la façon dont elles sont stockées peuvent rapidement devenir un problème important.
Maxime Jumelle
CTO & Co-Founder
Lire l'article
60 rue François 1er
75008 Paris
Blent est une plateforme 100% en ligne pour se former aux métiers Tech & Data.
Organisme de formation n°11755985075.
Data Engineering
IA Générative
MLOps
Cloud & DevOps
À propos
Gestion des cookies
© 2024 Blent.ai | Tous droits réservés