Fonctionnement du MapReduce

Hadoop et MapReduce en Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com
Jusque là on était focalisés sur le système de fichiers qui permet un meilleur traitement de gros volumes des données. Cependant, il n'est pas le seul à contribuer au succès de l'Hadoop. Un point important se situe du côté du modèle de programmation, MapReduce.

Dans cet article on abordera les concepts plus détaillés de ce modèle. On verra d'abord le fonctionnement plus schématisé de ce modèle. Grâce à cette partie on pourra mieux comprendre les fondamenteaux du système ainsi qu'aborder le paragraphe suivant. Il sera consacré aucombiner function qui peut venir au secours aux fonctions de map et de reduce, présentées dans l'introduction à l'Hadoop et MapReduce.

Comment fonctionne MapReduce ?
Dans le fonctionnement du MapReduce participent 4 acteurs :
- le jobclient (le client) : c'est lui qui soumet une tâche au MapReduce.
- le jobtracker : l'application qui coordonne la tâche soumise.
- les tasktrackers : une entité encore plus fine du jobtracker. C'est elle qui physiquement réalise les sous-tâches divisées par jobtracker.
- le système de fichiers distributé : il est utilisé pour partager les fichiers des tâches entre plusieurs tasktrackers. Pour savoir plus sur un système de fichiers distribué pour MapReduce, vous pouvez consulter l'article introduction à l'HDFS.

L'exécution d'une tâche est composée de différentes étapes :

  1. L'application MapReduce demande l'exécution d'un calcul. La tâche est envoyée au jobclient qui lui, s'occupe d'abord de récupérer l'identifiant de la tâche auprès du jobtracker.

  2. Après la réception de l'identifiant par jobclient, ce dernier s'occupe de copier les fichiers utilisés pour la tâche (données, configuration, JARs) dans le système de fichiers distribués (par exemple HDFS).

  3. Une fois cette opération terminée, il peut alors envoyer la tâche au jobtracker.

  4. Après avoir reçu le travail, jobtracker s'occupe d'initialiser la tâche. Dans ce processus un objet représentant la tâche est créé. Il encapsule toutes les tâches des tasktrackers ainsi que réserve l'endroit pour suivre la progression de l'exécution de ces tâches.

  5. Ensuite, grâce à des fichiers placés dans le système de fichiers distribué, jobtracker initialise les tâches des tasktrackers. Chaque partie des données à traiter possède une tâche map.

  6. Jobtracker assigne les sous-tâches aux tasktrackers. Ces derniers envoient des notifications au jobtracker. Grâce à elles, ce premier peut savoir si un tasktracker est prêt à recevoir une nouvelle tâche. En ce qui concerne la défition des tâches reduce, elles sont assignées dans l'ordre FIFO. Par contre, les tâches map sont assignées en fonction de la proximité du tasktracker avec la ressource stockant les données à traiter.

  7. Quand tasktracker obtient une sous-tâche à réaliser, il s'occupe d'abord de télécharger les fichiers de configuration et les JARs copiés sur le système de fichiers distribué par jobclient. Il crée également une nouvelle instance de la classe TaskRunner. C'est elle qui démarre une nouvelle JVM sur laquelle vont tourner toutes les sous-tâches du tasktracker.



Qu'est-ce que c'est combiner function ?
Jusque là on a vu deux fonctions du MapReduce : map et reduce. Mais il existe une troisième, combiner function. Elle est facultative. Si implémentée, elle s'incrustre entre map et reduce. Son objectif est de limiter le nombre de choses à analyser par la tâche reduce.

Les combiner functions sont utiles quand, par exemple, la bande passante utilisée pour la transmission des ressources entre map et reduce, est petite. Alors on peut faire exécuter ces fonctions directement sur les données produites par la tâche de mapping. Et cette économie de ressources est sa seule utilité dans le système. Il faut garder en tête que combiner function ne remplace pas la tâche de réduction.

Dans cet article on a découvert un peu plus le monde du MapReduce. On a pu voir le schéma de fonctionnement, de la définition de la tâche jusqu'à son aboutissement. Ensuite on a présenté une méthode qui permet d'économiser le volume des données transmises entre les fonctions map et reduce. On a vu qu'elle était très utile pour contourner les limitations imposées par la bande passante.
Bartosz KONIECZNY 08-09-2013 16:01 Hadoop
Moi

Développeur d'applications Internet et journaliste passionné par l'adjectif français. Un aigle polonais orienté vers la progression, volant très haut et écoutant du zouk après les matches du foot français.

Vous appréciez mon travail ?

Pour contribuer au développement de ce site, ou pour remercier pour des articles rédigés, vous pouvez faire un don.

Un conseil Symfony1

Comment détecter si l'utilisateur est connecté ?

Dans notre fichier layout.php on contient une partie réservée aux utilisateurs connectés et non-connectés. Pour pouvoir détecter cela sans trop de complication, on devrait utiliser les slots. Le fichier d'action va contenir le framgent suivant en fonction du type de l'utilisateur (connecté ou pas) :

$this->getResponse()->setSlot('isConnected', 'true');
Alors dans le fichier layout.php on pourra utiliser ceci :
if(!has_slot('isConnected')  ) {
  // include login form
  include_partial('users/formLogin');
}
else {
  include_partial('users/accountBox');
}