Comprendre Map, Shuffle et Reduce

Big DataBeginner
Pratiquer maintenant

Introduction

Les fichiers de produits du commerçant sont organisés et accessibles. Vous pouvez maintenant répondre à la question du premier lab : quels libellés de produits apparaissent le plus souvent ? Vous pourriez compter quelques lignes à la main, mais une collection qui grandit nécessite un calcul reproductible.

MapReduce est une façon d’organiser un calcul par lots. Map transforme les enregistrements d’entrée en paires clé/valeur ; Shuffle rassemble les valeurs ayant la même clé ; Reduce combine les valeurs de chaque clé pour produire un résultat. Pour WordCount, la clé est un libellé de produit et chaque occurrence contribue la valeur 1. Le comptage de mots est un petit exemple destiné à rendre visible le flux des données, plutôt qu’un système complet d’analyse des ventes.

Vous examinerez ces étapes avec un outil pédagogique préparé, puis exécuterez un véritable programme Hadoop WordCount précompilé sur les mêmes entrées. L’outil pédagogique affiche les étapes de l’algorithme dans un seul processus ; ce n’est pas une trace d’exécution distribuée. L’exécution Hadoop utilise le mode local pour vous permettre de vous concentrer sur le calcul avant de déplacer le même algorithme vers YARN dans le prochain lab. Aucune programmation Java ou Python n’est nécessaire.

Transformer les libellés de produits en paires clé/valeur

Dans cette étape, vous examinerez les entrées et suivrez chaque occurrence de produit à travers Map.

Commencez dans l’espace de travail local :

cd /home/labex/project

Lisez les six lignes d’entrée :

cat /home/labex/project/data/product-words.txt

Texte attendu :

notebook pen
notebook folder
pen pen
folder notebook
notebook
folder pen

Arrêtez-vous pour compter un produit à la main. notebook apparaît sur quatre lignes, une fois sur chacune ; pen apparaît quatre fois au total, dont deux fois sur la troisième ligne. folder apparaît trois fois. Le programme doit produire ces mêmes totaux.

Une paire clé/valeur associe un libellé à une valeur. Dans cet algorithme, Map émet (product, 1) pour chaque occurrence. Deux occurrences de pen créent deux paires distinctes, plutôt qu’une paire par ligne d’entrée.

L’exécutable wordcount-stages fourni accepte un nom d’étape et un fichier d’entrée local. Utilisez sa vue map :

/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt

La sortie commence par :

notebook 1
pen 1
notebook 1
folder 1

L’espace entre chaque clé et sa valeur est une tabulation. Il y a onze paires, une par occurrence de produit. Cet outil rend l’algorithme visible ; il ne démarre pas de services Hadoop et ne planifie pas de tâches. Enregistrez la sortie de cette étape :

/home/labex/project/tools/wordcount-stages map /home/labex/project/data/product-words.txt > /home/labex/project/output/map-pairs.txt

Vous avez modifié la représentation des entrées : des lignes entières sont devenues des contributions pouvant être regroupées par produit.

Regrouper et réduire les contributions

Dans cette étape, vous suivrez les paires à travers Shuffle et Reduce, puis relierez la sortie à votre prévision manuelle.

Map émet des contributions distinctes. Pour totaliser un produit, ses contributions doivent être réunies. Shuffle et le tri organisent les paires par clé pour qu’une tâche Reduce reçoive les valeurs d’un produit donné. Dans un traitement distribué, cela peut nécessiter des transferts de données entre tâches ; l’outil pédagogique affiche seulement les valeurs regroupées.

Examinez la vue regroupée :

/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt

Valeurs regroupées attendues :

folder 1,1,1
notebook 1,1,1,1
pen 1,1,1,1

Les clés sont triées. Chaque 1 séparé par une virgule représente toujours une occurrence originale, et non un nouvel enregistrement. Enregistrez le regroupement :

/home/labex/project/tools/wordcount-stages shuffle /home/labex/project/data/product-words.txt > /home/labex/project/output/shuffled-values.txt

Reduce combine les valeurs de chaque clé. Ici, il additionne les entiers. Une autre application pourrait combiner les valeurs autrement ; MapReduce ne se limite pas au comptage.

Examinez la vue réduite :

/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt

Résultats attendus :

folder 3
notebook 4
pen 4

Comparez ces valeurs aux comptages manuels de l’étape 1. Enregistrez le résultat pour pouvoir ensuite le comparer à celui de la véritable application Hadoop :

/home/labex/project/tools/wordcount-stages reduce /home/labex/project/data/product-words.txt > /home/labex/project/output/teaching-counts.txt

Le résultat dépend de toutes les occurrences de chaque clé, même lorsque celles-ci se trouvaient sur des lignes différentes. C’est pourquoi le regroupement se situe entre Map et Reduce.

Exécuter le véritable programme Hadoop WordCount

Dans cette étape, vous exécuterez le même comptage avec un exemple Hadoop précompilé en mode local.

Un JAR regroupe du code de programme Java. Hadoop et son JAR d’exemples sont déjà installés ; vous n’avez donc pas besoin de compiler de code. hadoop jar exécute le JAR nommé ; wordcount sélectionne son exemple WordCount. Les deux paramètres -D ci-dessous sélectionnent le framework d’exécution local et le système de fichiers local pour cette invocation. Les deux derniers arguments sont le fichier d’entrée et un nouveau répertoire de sortie :

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/data/product-words.txt /home/labex/project/output/local-wordcount

Attendez le retour de l’invite. Hadoop affiche des messages de progression et de diagnostic ; les chemins, les identifiants et les durées varient. Il s’agit d’un véritable programme Hadoop utilisant le moteur d’exécution local, plutôt que d’une application YARN. Le lab ne démarre aucun service HDFS ou YARN, et les entrées comme les sorties sont locales.

Listez le répertoire de sortie local :

ls /home/labex/project/output/local-wordcount

Vous devriez voir un marqueur _SUCCESS et un fichier de résultat part-.... _SUCCESS indique que la production des sorties s’est terminée avec succès, tandis que le fichier de résultat contient les données à vérifier. Le motif part-* du shell local sélectionne les fichiers de résultats. Faites passer leur contenu combiné dans sort pour stabiliser la comparaison :

cat /home/labex/project/output/local-wordcount/part-* | sort > /home/labex/project/output/hadoop-counts.txt

Comparez-les aux comptages de l’outil pédagogique :

diff /home/labex/project/output/teaching-counts.txt /home/labex/project/output/hadoop-counts.txt

Aucune différence ne doit apparaître. Vous avez relié l’algorithme expliqué à la sortie d’un véritable programme. Si le répertoire de sortie de cette exécution existe déjà, examinez ses fichiers terminés plutôt que de le supprimer aveuglément ou de supposer qu’une nouvelle soumission les écrasera.

Une distinction sera importante plus tard : un bloc HDFS stocke des octets, une division d’entrée (input split) décrit une unité de travail sur les entrées et une tâche exécute du travail. Ces éléments sont liés, mais ne correspondent pas toujours un à un. Les fichiers de résultats sont les sorties des tâches de traitement, et non des copies des blocs de stockage originaux.

Prévoir et tester une modification des entrées

Dans cette étape, vous ajouterez une occurrence de produit à une copie de travail et testerez quel résultat change.

Conservez l’entrée brute en lecture seule inchangée. Utilisez la commande locale cat avec > pour écrire une nouvelle copie de travail modifiable. Les deux chemins sont ici locaux ; le fichier de sortie sera celui que vous modifierez :

cat /home/labex/project/data/product-words.txt > /home/labex/project/output/changed-product-words.txt

Prévoyez les nouveaux comptages si vous ajoutez une occurrence de notebook : seul son total doit augmenter, de 4 à 5. printf affiche le texte fourni, \n désigne un saut de ligne et >> ajoute la sortie au lieu de remplacer le contenu existant :

printf 'notebook\n' >> /home/labex/project/output/changed-product-words.txt

Examinez l’entrée modifiée :

cat /home/labex/project/output/changed-product-words.txt

Il doit y avoir une nouvelle ligne finale. Exécutez le même programme Hadoop en ne modifiant que les chemins d’entrée et de sortie :

hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.5.0.jar wordcount -Dmapreduce.framework.name=local -Dfs.defaultFS=file:/// /home/labex/project/output/changed-product-words.txt /home/labex/project/output/changed-wordcount

Lisez les résultats réels dans l’ordre trié :

cat /home/labex/project/output/changed-wordcount/part-* | sort

Résultats attendus :

folder 3
notebook 5
pen 4

La nouvelle paire Map appartient au groupe notebook ; seul ce total Reduce change donc. Vous pouvez maintenant expliquer le résultat plutôt que simplement reconnaître une commande réussie. Dans le prochain lab, l’algorithme et les règles de comptage resteront les mêmes, tandis que HDFS fournira les entrées et YARN gérera les ressources d’exécution.

Résumé

Vous avez suivi les occurrences de produits jusqu’aux paires Map, regroupé les valeurs avec Shuffle et les avez combinées avec Reduce. Les résultats réels de Hadoop WordCount ont correspondu à votre calcul manuel et à l’outil pédagogique, puis ont changé comme prévu lors de l’ajout d’une occurrence aux entrées.

Vous avez utilisé le moteur local pour isoler l’algorithme. Vous conserverez ensuite cet algorithme et apprendrez comment une véritable application YARN lit les entrées HDFS et produit des résultats HDFS.