Sommaire

Test de la librairie MRJobs

Il s’agit ici d’exécuter les exemples vus en cours qui ont permis de compter les mots d’un livre en utilisant la librairie MRJobs.

Pour cela, commencez par copier les scripts wc1_mrjob.py et wc2_mrjob.py du répertoire TP_BigData_ECL sur le Namenode (avec la commande docker cp ...). N’oubliez pas, pour les utilisateurs de Windows, de rendre ces scripts exécutables (chmod +x ...), et de convertir ces fichiers au format Unix (dos2unix ...).

Ensuite, lancez la commande

python wc1_mrjob.py < dracula > resultInline.txt

et vérifiez, avec la commande cat resultInline.txt que le fichier contient bien le résultat escompté. Les symboles < et > sont des redirections en entrée et en sortie respectivement. Cette commande est identique à

python wc1_mrjob.py -r inline < dracula > resultInline.txt

le mode inline précisant que le job est lancé sur un seul process pour réaliser des tests.

Pour lancer le job sur plusieurs sous-process concurrents, il faut utiliser le mode local

python wc1_mrjob.py -r local < dracula > resultLocal.txt

Pour lancer le job sur le cluster hadoop:

python wc1_mrjob.py -r hadoop < dracula > resultHadoop.txt

Cette dernière commande permet bien de lancer le job sur le cluster hadoop, mais exploite le fichier d’entrée (ici dracula) en local (celui qui se trouve dans votre répertoire actuel de travail), et non le fichier stocké sur hdfs. Pour accéder au fichier dracule stocké dans le répertoire input sur hdfs :

python wc1_mrjob.py -r hadoop hdfs:///user/root/input/dracula > resultHadoop.txt

Il est également possible de lancer un job sur EMR (Amazon) ou Dataproc (Google cloud’).

GROUPE #1 - Travaux pratiques Hadoop/MRJobs

Objectif du travail Nous cherchons à recueillir des informations et calculer des statistiques sur des résultats de ventes stockés dans le fichier ventes/purchases.txt.

Les indications pour le CR sont données dans l’énoncé. Le travail est individuel.


Préparation et conseils

Dans le bash du Namenode, déplacez-vous dans le dossier ventes (à partir du premier Terminal) :

cd ../ventes

Les .. permettent de remonter d’un niveau dans l’arborescence des dossiers (nous étions dans le répertoire wordcount). Pour observer le contenu des 20 premières lignes ou des 10 dernières lignes présentes dans ce fichier :

head -n 20 purchases.txt
tail -n 10 purchases.txt

Ainsi, vous pouvez constater que le fichier est organisé en 6 colonnes :

  • date (format YYYY-MM-DD);
  • heure (format hh:mm);
  • ville d’achat;
  • catégorie de l’achat (parmi Book, Men’s Clothing, DVDs…);
  • somme dépensée par le client;
  • moyen de paiement (parmi Amex, Cash, MasterCard…).

Les colonnes sont séparées par une tabulation. Ce caractère est codé par \t en Python. Exemple : print("avant\tapres") permet d’obtenir l’impression de la chaîne “avant     apres”.

La commande Linux wc -l purchases.txt permet d’obtenir le nombre de lignes du fichier (soit 4 138 476 lignes!). Ce fichier est sans doute trop volumineux pour débugger vos algorithmes (le temps de debug en serait largement augmenté). Aussi, il est conseillé de travailler avec un extrait du fichier, que l’on peut obtenir de la manière suivante :

cat purchases.txt | head -n 100 > purchases_extrait100.txt

Cette commande extrait les 100 premières lignes du fichier et les stocke dans un fichier appelé purchases_extrait100.txt. N’oubliez cependant pas de vérifier vos scripts définitifs avec le fichier complet de données.

Pensez à envoyer ces deux fichiers sur HDFS, dans le dossier input :

hadoop fs -put purchases.txt input
hadoop fs -put purchases_extrait100.txt input

Remarque : Il n’est pas possible de programmer directement dans le bash du Namenode, car celui-ci ne dispose pas d’éditeur de texte graphique (vous avez quand même accès à vim et nano, mais en mode texte : essayez !). La solution consiste à

  1. programmer vos scripts map et reduce avec votre IDE préférée (Spyder, VSCoduim, Sublime Text…);
  2. stocker vos fichiers (appelé vente_mrjob.py par exemple) dans un dossier vente que vous aurez créé sur votre machine (à côté du répertoire wordcount de la première partie du TP ?);
  3. envoyer votre fichier vers le Namenode :
docker cp vente_mrjob.py hadoop-master:/root/ventes

Avant de lancer le job, pensez à rendre vos scripts exécutables :

chmod +x vente_mrjob.py

Vérifiez, avec la commande cat vente\_mrjob.py, que la première ligne du fichier est bien identique à :

#!/usr/bin/env python3

Si non, corrigez alors le fichier en conséquence ! Et si vous utilisez Windows, pensez également à convertir les fins de ligne de ces 2 fichiers avec dos2unix.

Vous êtes maintenant équipés pour développer les scripts map-reduce avec la librairie MRJobs.


Exercice 1 - Questionner un fichier de ventes (à reporter dans le CR)

Voici une liste de questions que vous programmerez obligatoirement à l’aide la librairie MRJob :

  1. Quel est le nombre d’achats effectués pour chaque catégorie d’achat ?
  2. Quelle est la somme totale dépensée pour chaque catégorie d’achat ?
  3. Quelle somme est dépensée dans la ville de San Francisco dans chaque moyen de paiement ?
  4. Dans quelle ville la catégorie Women’s Clothing a permis de générer le plus d’argent Cash ?
  5. Ajoutez une requête originale et complexe (i.e. nombre de STEPS > 1) de votre choix sur ce fichier. Dans le CR, prenez le temps de m’expliquez l’objectif de la requête, de présenter le code et le résultat obtenu : tableau, graphique…

Vous éditerez un fichier .py différent pour chaque question (à insérer dans votre CR).

Veuillez également reporter les résultats sur le fichier de données complet (sauf cas extrême d’une machine qui ne le supporterait pas). Vos programmes devront être testés en mode -r local ou -r hadoop, pour vérifier que vos algorithmes fonctionnent bien dans le cadre de traitements parallèles.

Exercice 2 - Anagramme (à reporter dans le CR)

Il est conseillé de créer un nouveau répertoire pour réaliser cette partie :

cd ..
mkdir anagramme
cd anagramme

Étant donné un fichier de mots, écrire un script map-reduce qui détecte les mots ayant EXACTEMENT les mêmes lettres (mais dans un ordre différent).

Ainsi, par exemple, le fichier de mots suivant

melon barre deviner lemon
arbre fiable fable vendre
devenir faible barbe

donnera en sortie cette liste:

faible, fiable
arbre, barre
devenir, deviner
lemon, melon

La sortie ne devra afficher que les réponses avec aux moins 2 mots. Dans cet exemple, les mots fable ou barbe n’apparaissent pas car ce sont les seuls mots de la liste avec ces lettres.

Pour vos tests, vous pourrez utiliser le fichier de mots suivant :

wget https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt

Cet algorithme devra fonctionner sous environnement Hadoop, avec plusieurs mapper et reducer en parallèle. L’algorithme ne devra pas tenir compte de la présence éventuelle de majuscules dans les mots.

GROUPE #2 - Travaux pratiques Hadoop/MRJobs

Objectif du travail Nous cherchons à recueillir des informations et calculer des statistiques sur des résultats de ventes stockés dans le fichier ventes/sales_data_sample.csv.

Les indications pour le CR sont données dans l’énoncé. Le travail est individuel.


Préparation et conseils

Dans le bash du Namenode, déplacez-vous dans le dossier ventes (à partir du premier Terminal) :

cd ../ventes

Les .. permettent de remonter dans l’arborescence des dossiers d’un niveau (nous étions dans le répertoire wordcount). Pour observer le contenu des 20 premières lignes ou des 10 dernières lignes présentes dans ce fichier :

head -n 20 sales_data_sample.csv
tail -n 10 sales_data_sample.csv

Ainsi, vous pouvez constater que le fichier est organisé en 20 colonnes, dont je vous laisse découvrir le contenu.

Les colonnes sont séparées par une tabulation. Ce caractère est codé par \t en Python. Exemple : print("avant\tapres") permet d’obtenir l’impression de la chaîne “avant     apres”.

La commande Linux wc -l sales_data_sample.csv permet d’obtenir le nombre de lignes du fichier (soit 2 824 lignes). Ce fichier est peut être trop volumineux pour débugger vos algorithmes. Aussi, il est conseillé de travailler avec un extrait du fichier, que l’on peut obtenir de la manière suivante :

cat sales_data_sample.csv | head -n 100 > sales_data_sample_extrait100.csv

Cette commande extrait les 100 premières lignes du fichier et les stocke dans un fichier appelé sales_data_sample_extrait100.csv. N’oubliez cependant pas de vérifier vos scripts définitifs avec le fichier complet de données.

Pensez à envoyer ces deux fichiers sur HDFS, dans le dossier input :

hadoop fs -put sales_data_sample.csv input
hadoop fs -put sales_data_sample_extrait100.csv input

Remarque : Il n’est pas possible de programmer directement dans le bash du Namenode, car celui-ci ne dispose pas d’éditeur de texte graphique (vous avez quand même accès à vim et nano, mais en mode texte : essayez !). La solution consiste à

  1. programmer vos scripts map et reduce avec votre IDE préférée (pourquoi pas Spyder ?);
  2. stocker vos fichiers (appelé vente_mrjob.py par exemple) dans un dossier vente que vous aurez créé sur votre machine (à côté du répertoire wordcount de la première partie du TP ?);
  3. envoyer votre fichier vers le Namenode :
docker cp vente_mrjob.py hadoop-master:/root/ventes

Avant de lancer le job, pensez à rendre vos scripts exécutables :

chmod +x vente_mrjob.py

Vérifiez, avec la commande cat vente\_mrjob.py, que la première ligne du fichier est bien identique à :

#!/usr/bin/env python3

Si non, corrigez alors le fichier en conséquence ! Et si vous utilisez Windows, pensez également à convertir les fins de ligne de ce fichier avec dos2unix.

Vous êtes maintenant équipés pour développer les scripts map-reduce avec la librairie MRJobs.


Exercice 1 - Questionner un fichier de ventes (à reporter dans le CR)

Remarques :

  • La première ligne du fichier contient les en-têtes des colonnes : il faut trouver un truc pour ne pas la considérer.
  • En manipulant le fichier, vous verrez 2 écueils principaux liés au séparateur utilisé dans ce fichier (,) :

    • Certaines données ne sont pas renseignées, entraînant l’apparition de colonne vide et donc de ,,. Est-ce gênant ?
    • Le séparateur apparaît à l’intérieur de certains champs, comme l’adresse. Le découpage en liste de champs à l’aide de la fonction split(sep=',') pose alors problème. Une solution consiste à pré-traiter le fichier (vous trouverez des méthodes décrites sur Internet) avant son traitement map-reduce.

Voici une liste de questions que vous programmerez obligatoirement à l’aide la librairie MRJob :

  1. Quelles sont toutes les catégories de produits (PRODUCTLINE) présentes dans le fichier ?
  2. Quel est le nombre de ventes (QUANTITYORDERED) réalisé pour chaque catégorie de produits ?
  3. Quel est le chiffre d’affaire (cf QUANTITYORDERED et PRICEEACH) par an et par catégorie de produits (tous pays confondus) ?
  4. Pour chaque pays, quel est le magasin (CUSTOMERNAME) qui a réalisé le plus gros chiffre d’affaire dans la catégorie de produits Trucks and Buses ?
  5. Ajoutez une requête originale et complexe (i.e. nombre de STEPS > 1) de votre choix sur ce fichier. Dans le CR, prenez le temps de m’expliquez l’objectif de la requête, de présenter le code et le résultat obtenu : tableau, graphique…

Vous éditerez un fichier .py différent pour chaque question (à insérer dans votre CR).

Veuillez également reporter les résultats sur le fichier de données complet (sauf cas extrême d’une machine qui ne le supporterait pas). Vos programmes devront être testés en mode -r local ou -r hadoop, pour vérifier que vos algorithmes fonctionnent correctement dans le cadre de traitements parallèles.

Exercice 2 - Particularité lexicale (à reporter dans le CR)

Étant donné un fichier de mots, écrire un script MRJob qui détecte les mots les plus longs ayant une seule voyelle (parmi aeiouy), éventuellement en plusieurs exemplaires. Par exemple, dans un dictionnaire de mots français, le mot abracadabrant est le mot le plus long (13 lettres) ne possédant que la voyelle a (en 5 exemplaires).

La sortie devra afficher de tels mots pour chacune des 7 voyelles.

Dictionnaires de mots Pour vos tests, vous pourrez utiliser

  • le fichier (de langue anglaise) suivant :
wget https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt
  • ou le fichier suivant (de langue française), mais faites attention aux voyelles accentuées
wget https://chrplr.github.io/openlexicon/datasets-info/Liste-de-mots-francais-Gutenberg\
/liste.de.mots.francais.frgut.txt

Cet algorithme devra fonctionner sous environnement Hadoop, avec plusieurs mapper et reducer en parallèle. L’algorithme ne devra pas tenir compte de la présence éventuelle de majuscules dans les mots.