Hadoop MapReduce from scratch

Archived course — implementing MapReduce from the ground up
Published

September 1, 2023

Archived course material, in French. This lab course has since been replaced by BGD701 — Big Data, which covers the same ground from TCP sockets up to a distributed MapReduce, with exercises and solutions. The sample code is still available: client.py · server.py · deploy.sh · getMachines.sh

résumé: Dans ce cours, vous apprendrez à implémenter une version simple du concept MapReduce en partant de zéro. C’est une sorte de ré-implémentation de Hadoop, codé en langage Java ou en langage Python.

Travaux pratiques - implémentation de Hadoop MapReduce "from scratch" en Java ou Python.”

Objectifs pédagogiques

Ce cours se présente sous la forme de Travaux Pratiques guidés. Vous utiliserez plusieurs ordinateurs connectés en réseaux et le langage de programmation Java ou Python pour implémenter une version simple du concept MapReduce. L’implémentation la plus connue est codée en Java, il s’agit de Hadoop. Vous visualiserez la Loi d’Ahmdal et la démontrerez empiriquement. Vous implémenterez le concept MapReduce et définirez une architecture répartie. Vous comparerez cette architecture répartie en terme de performances avec une architecture non répartie, séquentielle et en tirerez des conclusions.

Préparez un document de travail qu’il faudra rendre à la fin de l’unité d’enseignement.

Créez un document dans lequel vous allez expliquer votre implémentation au fur et à mesure, les problèmes rencontrés, les solutions innovantes, vos idées et réflexions, vos pistes d’améliorations. Il s’agit plutôt d’écrire ce qui vous étonne et ce que vous avez appris d’intéressant plutôt que de répondre de manière directe aux questions posées. Les questions dans les étapes de mise en place du projet n’ont pas besoin de réponse dans ce document, uniquement celles faisant référence à l’implémentation de votre projet et aux résultats de calcul obtenus ainsi que les discussions autour de ces résultats. Ce document sera un rapport de travail à rendre à la fin du cours.

Chronométrage et justification de la loi d’Ahmdal.

Tout le long du projet, vous obtiendrez des mesures de chronométrage et calculerez différents “speedup” (des accélérations) pour en déduire des taux de parallélisation (c’est à dire la portion de code parallèle). Pour chaque nouvelle mesure, vous devez exploiter ces mesures et les discuter. Évidemment, pour obtenir une accélération il faut comparer deux systèmes et les comparer dans des conditions les plus similaires possibles, c’est à dire à minima avec le même jeu de donnée en entrée et en prouvant que vous avez le même résultat en sortie. Pour prouver que vous obtenez le même résultat en sortie avec deux systèmes différents, vous utiliserez un troisième système (un outil/logiciel que vous trouverez vous-même) qui fait le même calcul (par exemple la fréquence des mots) et piocherez au hasard des mots pour savoir si dans le cas du système 1 et dans le cas du système 2 vous avez les même résultats.

Etape 1

Faire un programme séquentiel non parallélisé qui compte le nombre d'occurrences des mots dans un fichier.

Prérequis et documentation

Si vous voulez faire une version Java:

Si vous voulez faire une version Python:

  • programmer en Python
    https://github.com/fran6w/MDI721

Premier comptage en séquentiel pur

Implémentez un logiciel en java ou en python qui compte le nombre d’occurrences des mots d’un fichier d’entrée de manière non parallélisée (monothread, un seul thread , un seul processus léger), en utilisant un seul processeur.

Quelle structure de donnée est la plus pertinente pour stocker les résultats: en Java List, HashMap ou HashSet en Python dict set ou une autre ? Pour quelle raison ?

Testez votre programme avec un fichier d’entrée input.txt avec comme contenu:

Deer Beer River
Car Car River
Deer Car Beer

Résultat:

Deer 2

Beer 2

River 2

Car 3

Premier tri en séquentiel pur

Modifiez votre programme pour trier par nombre d'occurrences:

Résultat:

Car 3

Deer 2

Beer 2

River 2

Deuxième tri alphabétique en séquentiel pur

Modifiez le programme pour trier alphabétiquement pour les mots à égalité du nombre d’occurrences:

Résultat:

Car 3

Beer 2

Deer 2

River 2

Test du programme séquentiel sur le code forestier de Mayotte

Testez ensuite votre programme avec le code forestier de Mayotte disponible sur github forestier_mayotte.txt :
https://github.com/legifrance/Les-codes-en-vigueur

Votre programme a-t-il fonctionné du premier coup ?

Vérifiez en ouvrant le fichier texte qu’il contient bien du texte et non du code HTML.

Ne perdez pas de temps à corriger les éventuelles erreurs dues aux caractères spéciaux ou à des mots suspects ou illisibles (de toutes façons par la suite il y aura du chinois dans le texte).

Les 50 mots du code de la déontologie de la police nationale

Testez votre programme avec le code de déontologie de la police nationale disponible sur github deontologie_police_nationale.txt : https://github.com/legifrance/Les-codes-en-vigueur

De même ne perdez pas de temps à filtrer les caractères spéciaux ou autres mots bizarres. Pourquoi ? Car nous travaillerons ensuite sur des textes en chinois, japonais, arabe et d’autres langues. Si vous implémentez une étape de filtrage ici en français elle ne servira à rien par la suite. Quels sont les 5 premiers mots (qui ressemblent à des mots) parmi les 50 premiers de la liste triée résultat ? Gardez la réponse pour l’intégrer au rapport.

Les 50 mots du code du domaine public fluvial

Testez votre programme avec le code du domaine public fluvial domaine_public_fluvial.txt.

Quels sont les 5 premiers mots (qui ressemblent à des mots) parmi les 50 premiers de la liste triée résultat ? Gardez la réponse pour l’intégrer au rapport.

Les 50 mots du code de la santé publique

Testez votre programme avec le code de la santé publique sante_publique.txt.

Quels sont les 5 premiers mots (qui ressemblent à des mots) parmi les 50 premiers de la liste triée résultat ? Gardez la réponse pour l’intégrer au rapport.

Chronométrage du programme séquentiel

Chronométrer votre programme sur le code de la santé publique.

Chronométrage possible avec:

long startTime = System.currentTimeMillis();
...
long endTime   = System.currentTimeMillis();
long totalTime = endTime - startTime;

Combien de temps faut-il pour chacune des étapes:

  • Compter le nombre d’occurrences

  • Tri (par nombre d'occurrences et alphabétique)

Gardez la réponse pour l’intégrer au rapport.

Travailler sur des plus gros fichiers

Testez votre programme sur un cas réel: un extrait de toutes les pages internet transformées au format texte brut (format WET). Toutes les pages sur internet au format texte sont disponibles sur http://commoncrawl.org/ : chaque mois, environ 3 milliards de pages web, soit 250 To de données sont stockées. Ces données sont disponibles par tranche de moins d’1Go environ, vous travaillerez sur une tranche de 380Mo.

quelques conseils:

  • Utilisez la version WET qui ne contient que le texte des sites web (pas les images etc).
  • Décompressez le fichier wet.paths.gz pour obtenir wet.paths
  • chaque ligne du fichier wet.paths contient l’URL d’un fichier WET compressé, il faut ajouter au début https://data.commoncrawl.org/ pour pouvoir le télécharger
  • décompressez le fichier .wet.gz téléchargé pour obtenir finalement le fichier .wet (qui contient les données) avec la commande gzip -d nom_du_fichier_.warc.wet.gz

Testez votre programme avec un fichier WET en entrée. Chronométrez-le.

Gardez la réponse pour l’intégrer au rapport.

Si vous avez un erreur du type java.lang.OutOfMemoryError vous devez augmenter la taille mémoire de la machine virtuelle Java. Pour cela, sous Eclipse, suivez ce tutoriel: http://www.planetofbits.com/eclipse/increase-jvm-heap-size-in-eclipse/ . Par la suite, en ligne de commande, vous devrez ajouter l’option -Xms avec la valeur qui convient pour toutes les commandes java. Par exemple, java -Xms1000m pour avoir 1000Mo de mémoire alloués pour cette commande java.

Travailler sur plusieurs gros fichiers

j’ai téléchargé pour vous 3995 fichiers au hasard depuis le site commoncrawl. Vous les trouverez dans le dossier

/cal/commoncrawl

pour pouvoir y accéder, il faut se connecter à une machine de l’école puis aller dans ce dossier une première fois en faisant

cd /cal/commoncrawl

ce n’est qu’une fois que vous avez fait cette commande que les fichiers vont apparaître dedans.

Vous avez un total de 1,3 To de données pour vous amuser.

graphique sur le temps de calcul en fonction de la taille du fichier

Vous avez testé et chronométré votre programme séquentiel sur différentes tailles de fichier. Tracez un graphique du temps de calcul en fonction de la taille du fichier. Quel type de courbe obtenez-vous ? Gardez la réponse pour l’intégrer au rapport.

Pouvons-nous considérer que le temps de calcul est linéaire en fonction de la taille du fichier ? Si non, est-ce que la courbe devient linéaire à partir d’une certaine taille ? Si c’est le cas nous dirons que le temps de calcul est linéaire et nous pourront extrapoler le temps de calcul pour des fichiers plus gros que ceux testés (ou des tailles globales de données plus importantes). Gardez la réponse pour l’intégrer au rapport.

Travailler avec plusieurs ordinateurs en réseau.

Prérequis et documentation

Nom court, nom long

Quel est le nom COURT de votre ordinateur (le nom simple sans le domaine) ?   quel est le nom LONG de votre ordinateur (le nom avec le domaine) ? Comment les connaître en ligne de commande ? Sur les ordinateurs de l’école, est-il possible d’obtenir ces noms autrement qu’en ligne de commande ? Ajoutez les réponses à votre rapport.

Adresse ip

Comment connaître les adresses (plusieurs) IP de votre ordinateur en ligne de commande ? Autrement (en passant par un site internet par exemple) ? Ajoutez les réponses à votre rapport.

Du nom vers l’IP

Comment à partir du nom d’un ordinateur, obtenir les adresses IP en ligne de commande ? Ajoutez les réponses à votre rapport.

De l’IP vers le nom

Comment, à partir d’une adresse IP, obtenir les noms associés en ligne de commande ? Ajoutez les réponses à votre rapport.

Ping pong à l’intérieur!

Testez la communication avec d’autres ordinateurs (pas le vôtre) depuis le réseau de l’école en utilisant la commande ping (pour arrêter le ping faire CTRL + C). suivi du nom court, du nom long, de l’IP. Les trois méthodes fonctionnent-elles ? Ajoutez les réponses à votre rapport.

Ping pong à l’extérieur

Si vous effectuez le ping depuis un réseau différent, il est possible que celui ne fonctionne pas (filtrage des accès vers le réseau de l’école depuis un réseau extérieur), contactez la DSI pour mettre en place une connection VPN / OpenVPN afin d’être sur le même réseau que les machines en salle de TP.

Calculer en ligne de commande sur l’ordinateur local

Comment lancer un calcul en ligne de commande sur votre ordinateur (par exemple 2 + 3) ? Parmi les multiples réponses possibles, lesquelles permettent de lancer le calcul et d’obtenir le résultat en appuyant une seule fois sur la touche <Entrée> ? Ajoutez les réponses à votre rapport.

Calculer en ligne de commande sur un ordinateur distant

Comment lancer un calcul  (par exemple 2 + 3) en ligne de commande sur un autre ordinateur (à distance) ? Il faudra certainement vous authentifier avec un mot de passe. Comment obtenir le résultat du calcul immédiatement après avoir tapé son mot de passe ? Ajoutez les réponses à votre rapport.

Calculer à distance sans mot de passe

Comment lancer un calcul à distance en utilisant SSH sans taper le mot de passe et en une seule ligne de commande (c’est à dire qu’on appuie sur <Entrée> et on a le résultat directement)?

Attention: en utilisant vos ordinateurs personnels( a priori ce n’est pas le cas sur les ordinateurs de l’école), il faut parfois vérifier le “fingerprint” avec le message:

The authenticity of host 'mint.phcomp.co.uk (78.32.209.33)' can't be established.
RSA key fingerprint is 6a:de:e0:af:56:f8:0c:04:11:5b:ef:4d:49:ad:09:23.
Are you sure you want to continue connecting (yes/no)? yes

Pour ne plus avoir à rentrer quoi que ce soit dans le terminal, il faut donc désactiver la vérification de ce “fingerprint”, sinon vous aurez l’erreur 

Host key verification failed

Suivez ce guide pour désactiver la vérification de “fingerprint”:

https://www.shellhacks.com/disable-ssh-host-key-checking/

clés SSH: à ne faire que si vous n’avez pas de clé publique clé privée déjà générée avec un autre cours (sinon vous perdrez l’accès à des serveurs pour les autres cours)

De plus, si vous travaillez depuis votre ordinateur personnel, pour ne pas avoir à taper le mot de passe à chaque fois, il faut générer une clé privée et une clé publique SANS PASSPHRASE (ne pas mettre de mot de passe lors de la génération des clés) et installer la clé publique sur un ordinateur de l’école, en copiant le contenu de la clé publique dans le fichier authorized_keys. Ce fichier authorized_keys est a placer dans le dossier .ssh (attention, il y a un point devant ssh “.ssh”), lui même situé dans votre dossier personnel sur les machines de l’école. Pour cela, suivez un guide sur internet de création de clés publiques privées pour SSH. Attention, votre clé privée doit également être située dans le dossier .ssh de votre ordinateur personnel. La bonne configuration est donc: avoir une clé privée sur l’ordinateur personnel dans le dossier .ssh de votre ordinateur personnel et avoir une clé publique sur un ordinateur de l’école dans le dossier .ssh d’un ordinateur de l’école. Attention: sur Windows, il est parfois compliqué de créer le dossier .ssh. Sur Windows, il est également compliqué de générer des clés avec puttygen car le format des clés n’est pas compatible avec openssh utilisé à l’école. Puttygen a une option de conversion du format des clés (dans le menu conversions) pour convertir vers le fomat openssh. Le plus simple est de générer les clés sur une machine de l’école puis de copier la clé privée sur votre ordinateur perso plutôt que de générer la clé sur votre ordi perso... Demandez de l’aide à vos confrères experts en cas de pb. Ne restez pas coincé longtemps sur cette étape!

Travailler avec des fichiers locaux ou sur un serveur NFS.

Prérequis et documentation

Chemin absolu

Quel est le chemin absolu de votre répertoire personnel, votre home directory ? (commandes “cd” puis “pwd”)

Un fichier dans le répertoire personnel

Créez un fichier fperso.txt contenant le texte “bonjour” dans votre répertoire personnel (sur un ordinateur de l’école). 

Vérifiez le contenu du fichier avec cette commande exactement:

cat ~/fperso.txt

Ou se trouve le fichier dans le répertoire personnel

Ce fichier est-il sur le disque dur de l’ordinateur ou autre part ? Comment savoir où est stocké physiquement ce fichier, à l’aide de quelle commande ? 

Un dossier et un fichier dans le répertoire temporaire

Créez un dossier /tmp/<votre nom d’utilisateur> en remplaçant <votre nom d’utilisateur> (ne pas mettre les caractères < et > ).

Créez un fichier ftemp.txt dans le répertoire /tmp/<votre nom d’utilisateur> .

Vérifiez le contenu du fichier avec cette commande exactement:

cat /tmp/<votre nom d’utilisateur>/ftemp.txt

Ce dossier et ce fichier sont-ils sur le disque dur de l’ordinateur ou autre part ? Comment savoir où sont stockés physiquement ces éléments, à l’aide de quelle commande ?

Trois ordinateurs A B C. On commence avec A. Utilisation du serveur NFS.

Pour les questions suivantes, utilisez trois ordinateurs: A, B C.

Connectez vous physiquement (avec un clavier, une souris et un écran) sur l’ordinateur A.

Sur A, créez un fichier text.txt contenant le texte “mon texte sur NFS” dans votre répertoire personnel.

Vérifiez que le fichier existe et vérifiez son contenu. Pour cela, sur A, utilisez la commande :

cat ~/text.txt

Trois ordinateurs A B C. On continue sur B et sur C. Utilisation du serveur NFS.

Connectez-vous à B (physiquement ou à distance) et vérifiez que le fichier text.txt est également présent dans votre répertoire personnel. Pour cela, sur B, utilisez la commande :

cat ~/text.txt

De même, connectez-vous à C et vérifiez que text.txt est aussi présent.

Remarquez que vous n’avez pas copié le fichier mais qu’il est présent sur A, B et C grâce au serveur NFS.

Trois ordinateurs A B C. On commence avec A. Utilisation des disques locaux.

Déconnectez vous de B et de C et revenez sur l’ordinateur A.

Sur A, créez un dossier /tmp/<votre nom d’utilisateur> et un fichier local.txt contenant le texte “mon texte sur disque local” dans ce dossier /tmp/<votre nom d’utilisateur>.

Vérifiez que le fichier existe et vérifiez son contenu. Pour cela, sur A, utilisez la commande :

cat /tmp/<votre nom d’utilisateur>/local.txt

Trois ordinateurs A B C. On continue sur B et sur C. Utilisation des disques locaux.

Connectez-vous à B et C (physiquement ou à distance) et vérifiez que le dossier <votre nom d’utilisateur> ainsi que le fichier local.txt ne sont pas présent dans /tmp . Pour cela vérifiez avec la commande:

ls /tmp

Depuis A, copier de A vers B avec les disques locaux.

Comment, à partir de A, transférer le fichier /tmp/local.txt sur B (dans /tmp/<votre nom d’utilisateur>/local.txt) en utilisant scp ? Vérifiez que le fichier est bien présent sur B. Attention: si vous avez une erreur “no such file or directory” (ou l’équivalent français), vous devez d’abord créer le répertoire /tmp/<votre nom d’utilisateur>/ avec la commande mkdir -p associée à un ssh pour l’ordinateur distant.

Depuis A, copier de B vers C avec les disques locaux.

Comment, à partir de A, transférer le fichier de B (depuis /tmp/<votre nom d’utilisateur>/local.txt) vers C (dans /tmp/<votre nom d’utilisateur>/local.txt) ? Vérifiez que le fichier est bien présent sur C. De même que la question précédentes, vous devez créer les répertoires /tmp/<votre nom d’utilisateur>/ correspondants.

Lancer des programmes à distance manuellement.

utilisez les scripts deploy.sh et getMachines.sh pour déployer votre programme sur les machines de l’école.

Testez les serveurs déployés avec un client (le MASTER).

Lancer des programmes sur plusieurs machines et afficher la sortie standard et la sortie d’erreur.

Prérequis et documentation

  • connaître les sorties standard et les sorties d’erreurs

Un programme qui simule une erreur

Modifiez le serveur pour qu’il fasse une erreur (par exemple en divisant par zéro) et affiche un message d’erreur.

Vérifiez que le message d’erreur s’affiche bien sur la sortie d’erreur.

simulation de calcul.

Un WORKER qui simule un calcul de 10 secondes.

Modifiez votre programme WORKER pour qu’il simule une attente de 10 secondes avant d’afficher quelque-chose dans la sortie standard. Pour cela inventez un protocole et utilisez

en java:

Thread.sleep(10000); 

en python:

time.sleep(10)

Vérifiez le bon fonctionnement du WORKER et constatez qu’il y a 10 secondes entre le démarrage du WORKER et l’affichage du résultat.

etape 7

déployez 5 WORKERS

faites un MASTER qui envoie la liste des 5 WORKERS aux 5 WORKERS (inventez un protocole)

une fois que les WORKERS ont reçu la liste des WORKERS, ils doivent se mettre en mode “accept” pour accepter des connections, envoyez une confirmation au MASTER comme quoi vous êtes prêt à recevoir des connections.

une fois que le MASTER a reçu toutes les confirmations, il envoie à tous les WORKERS un “GO” pour qu’ils se disent “hello”

vérifiez que tous les WORKERS se sont dit “hello”

etape8

etape 9

MapReduce - SPLIT et MAP

Prérequis et documentation pour les questions suivantes :

création des splits

Créez trois fichiers correspondants à des “splits” dans le répertoire temporaire. Dans un premier temps, créez ces fichiers manuellement. 

 /tmp/<votre nom d’utilisateur>/splits

S0.txt S1.txt S2.txt.
S0.txt contient:

Deer Beer River

S1.txt contient:

Car Car River

S2.txt contient:

Deer Car Beer

Attention, le répertoire /tmp/<votre nom d’utilisateur>/splits doit être créé sur les 3 ordinateurs s’il n’existe pas.

Un WORKER qui fait la phase de map

Modifiez le WORKER pour qu’il calcule un map à partir d’un split.

Pour démarrer le calcul lors du déploiement réel du système réparti, vous inventerez un protocole qui permet de signaler au WORKER de commencer à calculer le MAP. Le nom du fichier sera aussi envoyé par le protocole de communication.

Un MASTER qui lance les WORKERS pour la phase de map.

Modifiez le MASTER pour qu’il lance la phase de map sur plusieurs machines à l’aide d’un protocole et affiche “MAP FINISHED”.

Pour bien synchroniser le MASTER avec les WORKERS, veillez à afficher “MAP FINISHED” qu’une fois tous les WORKERS terminés et uniquement quand tous les WORKERS sont terminés, PAS AVANT! Le MASTER doit donc attendre que WORKERS se terminent correctement. Il faut donc que votre protocole contienne une notification de fin du MAP.

MapReduce - SHUFFLE

Le MASTER qui prépare les WORKERS à la phase de shuffle.

Modifiez le MASTER pour qu’il envoie la liste des WORKERS à tous les WORKERS.

Le WORKER qui prépare la phase de shuffle.

Modifiez le WORKER pour qu’il prépare la phase de shuffle, en calculant le “hash” pour chacune des clés et avec un modulo sur le nombre de machines de la liste, qui calcule quelle est la machine responsable de cette clé.

Le WORKER qui exécute la phase de shuffle.

Modifiez le WORKER pour qu’il exécute la phase de shuffle.

Pour savoir sur quelle machine il faut envoyer les clés-valeurs, on utilise le hash calculé à partir de la clé (une valeur entière) et le nombre de machines du fichier. Il suffit de calculer le hash modulo le nombre de machine en considérant que la première machine du fichier a pour numéro 0, la deuxième 1 etc... La formule utilisée pour trouver la machine sur laquelle sera envoyée le shuffle sera donc

numeroMachine = hash % nbMachines

Un MASTER qui lance et attend la fin de la phase de shuffle.

Modifiez le MASTER pour qu’il lance la phase de shuffle une fois que la phase de map est terminée, sur plusieurs machines et affiche “SHUFFLE FINISHED”.

Pour bien synchroniser le MASTER avec les WORKERS, veillez à afficher “SHUFFLE FINISHED” qu’une fois tous les SLAVEs terminés et uniquement quand tous les SLAVEs sont terminés, PAS AVANT! Le MASTER doit donc attendre que SLAVEs se terminent correctement.

MapReduce - REDUCE

Le WORKER qui exécute la phase de reduce.

Modifiez le WORKER pour qu’il prépare la phase de reduce en regroupant les clés avec le même hash, en calculant le reduce pour chacune des clés

Un MASTER qui lance et attend la fin de la phase de reduce .

Modifiez le MASTER pour qu’il lance la phase de reduce une fois que la phase de shuffle est terminée, sur plusieurs machines et affiche “REDUCE FINISHED”.

Pour bien synchroniser le MASTER avec les WORKERS, veillez à afficher “REDUCE FINISHED” qu’une fois tous les WORKERS terminés et uniquement quand tous les WORKERS sont terminés, PAS AVANT! Le MASTER doit donc attendre que SLAVEs se terminent correctement.

Un MASTER qui chronomètre les phases.

Modifiez le MASTER pour qu’il chronomètre les différentes phases MAP, SHUFFLE, REDUCE et pour qu’il affiche le temps de chacune des phases.

Testez sur l’exemple de départ avec les trois splits suivants:

S0.txt S1.txt S2.txt.
S0.txt contient:

Deer Beer River

S1.txt contient:

Car Car River

S2.txt contient:

Deer Car Beer

Quelle est la phase qui prend le plus de temps ? Quelle est la phase la plus rapide ?

MapReduce - finalisations et optimisations

Un MASTER qui affiche le résultat à partir de plus gros splits

Modifiez le MASTER pour qu’il utilise des plus gros splits déjà existants dans le dossier /cal/commoncrawl

ATTENTION, ce dossier n’est pas visible, ni les fichiers à l’intérieur, tant que vous n’avez pas “parcouru” ce dossier.

Il faut donc écrire manuellement /cal/commoncrawl une première fois:

Par exemple, pour pouvoir y accéder, il faut, depuis une machine de l’école, aller dans ce dossier une première fois en faisant

cd /cal/commoncrawl

ce n’est qu’une fois que vous avez fait cette commande que les fichiers vont apparaître dedans.

Vous avez un total de 1,3 To de données pour vous amuser.

Démontrez empiriquement la loi d’Ahmdal

Démontrez empiriquement la loi d’Ahmdal, en faisant varier la quantité de donnée traitée ainsi que le nombre de machines. Vous ferez des graphiques explicatifs et en tirerez des conclusions. Le speedup doit se baser sur la version séquentielle vu au tout début du projet.

Une prise en compte des pannes

Créez une copie de votre projet sur laquelle vous travaillez sur la robustesse: faites en sorte que votre programme fonctionne malgré des pannes inopinées de certaines machines. Pour tester, vous pouvez éteindre une ou plusieurs machines au milieu de calculs. Vous pouvez inventer d’autres pannes vous-même et présenter vos résultats. Comparez avec la méthode de robustesse utilisée par Google : https://research.google.com/archive/mapreduce-osdi04.pdf