MapReduce
Qu’est-ce que MapReduce ?
MapReduce est un framework d'exécution distribué en Java au sein de l'écosystème Apache Hadoop. Il élimine la complexité de la programmation distribuée en exposant deux étapes de traitement implémentées par les développeurs : 1) Map (mappage) et 2) Reduce (Réduction). À l'étape Map, les données sont réparties entre différentes tâches de traitement parallèles. La logique de transformation peut être appliquée à chaque groupe de données. Une fois achevée, la phase Reduce prend le relais pour traiter l'agrégation des données depuis le dataset Map. En règle générale, MapReduce utilise le système de fichiers distribué Hadoop (HDFS) en entrée et en sortie. On peut toutefois y ajouter certaines technologies, comme Sqoop, pour faciliter l'accès aux systèmes relationnels.
Histoire de MapReduce
MapReduce a vu le jour entre les murs de Google en 2004, grâce au travail de Jeffery Dean et Sanjay Ghemawat (Dean & Ghemawat, 2004). Présenté dans un article intitulé « MapReduce : simplification du traitement des données sur les grands clusters », MapReduce s'inspire des fonctions Map et Reduce couramment employées dans la programmation fonctionnelle. À l'époque, le système MapReduce, exclusivité de Google, s'exécutait sur le système de fichiers Google, ou GFS.En 2014, Google n'utilisait plus MapReduce comme principal modèle de traitement du Big Data. Il fut un temps où MapReduce était la seule méthode permettant d'extraire des données stockées dans HDFS, mais ce n'est plus le cas aujourd'hui. Il existe en effet d'autres systèmes de requête comme Hive et Pig, qui permettent d'extraire des données de HDFS en utilisant des déclarations de type SQL, qui s'exécutent aux côtés de tâches écrites selon le modèle MapReduce.
Comment fonctionne MapReduce ?
Un système MapReduce repose généralement sur trois étapes (bien qu'on le résume souvent à la combinaison des opérations/fonctions Map et Reduce). Les opérations de MapReduce sont les suivantes :
- Mappage : les données d'entrée sont d'abord divisées en blocs plus petits. Le framework Hadoop décide ensuite du nombre de mappeurs à utiliser en fonction de la taille des données à traiter et du bloc de mémoire disponible sur chaque serveur mappeur. Chaque bloc est alors affecté à un mappeur à des fins de traitement. Chaque nœud de travail applique la fonction map aux données locales et inscrit le résultat dans un stockage temporaire. Le nœud primaire ou principal veille à ce qu'un seul exemplaire des données d'entrée redondantes soit traité.
- Mélange, combinaison, partitionnement : les nœuds de travail redistribuent les données en fonction des clés de sortie (produites par la fonction map), de sorte que toutes les données appartenant à une même clé soient situées sur le même nœud de travail. À titre facultatif, le combineur (un réducteur) peut s'exécuter sur chaque serveur mappeur pour réduire les données de chaque mappeur, l'objectif étant de réduire leur empreinte et de faciliter le mélange et le tri. Le partitionnement (qui n'est pas facultatif) est le processus qui détermine comment les données doivent être présentées au réducteur et les affecte à un réducteur spécifique.
- Réduction : le réducteur ne peut pas commencer sa tâche tant que le mappeur s'exécute encore. Les nœuds de travail traitent chaque groupe de données de sortie de paires <clé,valeur> en parallèle pour produire des paires <clé,valeur> en sortie. Toutes les valeurs de sortie qui ont la même clé sont affectées à un même réducteur qui va alors agréger les données pour cette clé. Contrairement à la fonction Map qui est obligatoire pour filtrer et trier les données d'origine, la fonction Reduce est facultative.
Quelles sont les choses à savoir sur MapReduce ?
Le paradigme de programmation Map Reduce est rigide
Certes, mettre les interfaces Map et Reduce à la disposition des programmeurs a simplifié la création d'applications distribuées dans Hadoop, mais un large éventail de logiques reste difficile à exprimer dans le paradigme de programmation MapReduce. Le processus itératif, par exemple, ne fonctionne pas bien dans MapReduce. En règle générale, les données ne sont pas conservées dans la mémoire, et la logique itérative repose sur un enchaînement d'applications MapReduce, ce qui augmente la complexité.
Activité intensive de lecture/écriture
Les tâches MapReduce conservent peu de données en mémoire, car ce système est dépourvu de structure de mémoire distribuée pour les données utilisateur. Les données doivent donc être lues et écrites sur HDFS. Des applications MapReduce plus complexes impliquent un enchaînement de tâches MapReduce plus réduites. Comme les données ne peuvent pas être transmises d'une tâche à l'autre, il faut un partage de données via HDFS, ce qui crée immanquablement un goulet d'étranglement au niveau du traitement.
Axé sur Java
MapReduce est basé sur Java : la façon la plus efficace d'écrire des applications pour MapReduce sera donc d'utiliser Java. Le code doit être compilé dans un environnement de développement distinct, puis déployé sur le cluster Hadoop. Ce style de développement n'est pas courant chez les data analysts et les data scientists qui ont l'habitude d'utiliser d'autres technologies comme SQL ou des langages interprétés comme Python. MapReduce peut effectivement invoquer une logique Map/Reduce écrite dans un autre langage, tel que C, Python ou script Shell. Mais pour ce faire, il doit lancer un processus système pour traiter l'exécution de ces programmes. Cette opération consomme des ressources supplémentaires et peut donc dégrader les performances de la tâche.
Abandon progressif des offres Big Data
Les offres Big Data abandonnent progressivement MapReduce. Si certains fournisseurs l'incluent toujours dans leur distribution Hadoop, c'est souvent uniquement pour prendre en charge les applications héritées. Les clients ont cessé de créer des applications MapReduce et privilégient désormais des frameworks plus simples et plus rapides comme Apache Spark.
Dans quelles situations utilise-t-on MapReduce ?
Les applications héritées et les outils natifs d'Hadoop comme Sqoop et Pig utilisent toujours MapReduce aujourd'hui. Le développement d'applications MapReduce est très limité et aucune contribution significative n'est apportée à son code open source.
Idées reçues sur MapReduce et Spark
- À propos de MapReduce
- À propos de Spark
Avantages de MapReduce
- Évolutivité
- Flexibilité
- Sécurité et authentification
- Traitement plus rapide des données
- Modèle de programmation très simple
- Disponibilité et résilience par défaut
Conseils simples sur l'amélioration des performances de MapReduce
- Activez le mode uber
- Utilisez une bibliothèque native
- Augmentez la taille de bloc
- Supervisez le temps pris par les tâches de mappage
- Identifiez si la compression des données peut être divisée ou non
- Définissez le nombre de tâches réduites
- Analysez la partition des données
- Effectuez des variations de performance dans la phase de mélange
- Optimisez le code MapReduce
MapReduce et Databricks Delta Engine
Le Databricks Delta Engine est basé sur Apache Spark et un moteur en C++ appelé Photon. Il offre la flexibilité de traitement DAG qui manque à MapReduce, la vitesse du traitement en mémoire et un moteur compilé natif qui affiche des temps de réponse aux requêtes exceptionnels. Les utilisateurs peuvent interagir avec le Databricks Delta Engine en Python, Scala, R ou SQL. Une simple modification sur une seule ligne permet de convertir les applications Spark existantes pour qu'elles utilisent le Delta Engine : il faut juste spécifier « delta » comme format de données. MapReduce et HDFS ne prennent pas nativement en charge la cohérence transactionnelle des données et ne permettent pas de modifier/supprimer des données au sein des datasets. Le Delta Engine autorise l'accès simultané aux données par les producteurs et les consommateurs de données, et fournit des capacités CRUD complètes. Enfin, MapReduce ne possède aucune fonctionnalité intégrée pour le traitement des petits fichiers, un problème qu'on rencontre fréquemment dans les environnements Big Data. Le Databricks Delta Engine a une fonction de compactage automatique qui optimise la taille des données inscrites dans le stockage. Il propose également une commande OPTIMIZE qui peut compacter les fichiers à la demande. Grâce à la fonction de cohérence transactionnelle de Delta, cette opération peut être réalisée pendant que des utilisateurs finaux ou des applications accèdent aux données.
Cinq excellentes alternatives à MapReduce
- Apache Spark
- Apache Storm
- Ceph
- Hydra
- Google BigQuery