126 votes

Chaînage de plusieurs emplois MapReduce à Hadoop

Dans de nombreuses situations de la vie réelle où vous appliquez MapReduce, la finale des algorithmes finissent par être plusieurs étapes MapReduce.

I. e. Map1 , Reduce1 , Map2 , Reduce2 , etc.

Vous avez donc la sortie de la dernière de réduire ce qui est nécessaire comme l'entrée de la carte suivante.

L'intermédiaire des données est quelque chose que vous (en général) ne souhaitez pas les conserver, une fois que le pipeline a été complété avec succès. Aussi parce que cet intermédiaire les données sont en général des structure de données (comme une "carte" ou un "set"), vous ne voulez pas mettre trop d'effort dans l'écriture et la lecture de ces paires clé-valeur.

Quelle est la meilleure façon de le faire dans Hadoop?

Est-il un (simple) exemple qui montre la façon de traiter ces données intermédiaires dans le bon sens, y compris le nettoyage par la suite?

Merci.

58voto

Binary Nerd Points 6497

Je pense que ce tutoriel sur Yahoo réseau de développeurs vont vous aider avec ceci: enchaînement de tâches

Vous utilisez le JobClient.runJob(). Le chemin de sortie des données de la première tâche devient le chemin d'entrée à votre deuxième emploi. Ces doivent être passés comme arguments à vos travaux avec le code approprié pour les analyser et définir les paramètres pour le travail.

Je pense que la méthode ci-dessus peut toutefois être le moyen le plus âgé mapred de l'API, mais il doit encore travailler. Il y aura une méthode similaire dans le nouveau mapreduce API, mais je ne suis pas sûr de ce qu'il est.

Aussi loin que la suppression de données intermédiaire après un travail est terminé, vous pouvez le faire dans votre code. La façon dont je l'ai fait avant est d'utiliser quelque chose comme:

FileSystem.delete(Path f, boolean recursive);

Où le chemin est l'emplacement sur HDFS des données. Vous devez vous assurer que vous ne pouvez supprimer ces données une fois pas d'autre emploi l'exige.

21voto

user381928 Points 181

Il ya beaucoup de façons dont vous pouvez faire. (1) en Cascade emplois

Créer le JobConf objet "tâche1" pour le premier emploi et de régler tous les paramètres avec "entrée" comme inputdirectory et "temp" comme répertoire de sortie. Exécuter cette tâche: JobClient.exécuter(tâche1).

Immédiatement au-dessous, créez le JobConf objet "job2" pour la deuxième emploi et de régler tous les paramètres avec "temp" comme inputdirectory et de "sortie" comme répertoire de sortie. Exécuter cette tâche: JobClient.exécuter(job2).

(2) la création de deux JobConf objets et définir tous les paramètres en eux comme (1), sauf que vous n'utilisez pas JobClient.exécuter.

Ensuite, créez deux objets avec jobconfs comme paramètres: Travail tâche1=nouvel Emploi(jobconf1); Job job2=nouvel Emploi(jobconf2);

À l'aide de la jobControl objet, vous devez spécifier les dépendances entre les tâches, puis exécuter les travaux: JobControl jbcntrl=new JobControl("jbcntrl"); jbcntrl.addJob(tâche1); jbcntrl.addJob(job2); job2.addDependingJob(tâche1); jbcntrl.run();

(3) Si vous avez besoin d'une structure un peu comme une Carte de+ | Réduire | Carte*, vous pouvez utiliser le ChainMapper et ChainReducer classes qui viennent avec Hadoop version de 0,19 et au-delà.

Cheers

7voto

cwensel Points 1156

Il ya effectivement un certain nombre de façons de le faire. Je vais me concentrer sur deux.

Est par l'intermédiaire de Riffle ( http://github.com/cwensel/riffle ) une annotation de bibliothèque pour l'identification dépendante de choses et 'exécution' dans la dépendance (topologique) de commande.

Ou vous pouvez utiliser une Cascade (et MapReduceFlow) en Cascade ( http://www.cascading.org/ ). Une future version de support de Fusil, les annotations, mais il fonctionne très bien maintenant avec raw M. JobConf emplois.

Une variante de cette est de ne pas gérer, MONSIEUR emplois par la main à tous, mais de développer votre application à l'aide de la Cascade de l'API. Puis le JobConf et de l'emploi de chaînage est géré en interne par la Cascade de planificateur et de Flux de classes.

De cette façon, vous passez votre temps en vous concentrant sur votre problème, pas sur la mécanique de la gestion de Hadoop emplois etc. Vous pouvez même couche de langues différentes sur le dessus (comme clojure ou jruby) pour simplifier votre développement et les applications. http://www.cascading.org/modules.html

4voto

Reko Points 83

Vous pouvez utiliser oozie pour barch traiter vos travaux de MapReduce. http://issues.Apache.org/JIRA/Browse/HADOOP-5303

3voto

Il y a des exemples dans projet Apache Mahout chaînes ensemble plusieurs travaux de MapReduce. Un des exemples peut être trouvé à :

RecommenderJob.java

http://Search-Lucene.com/c/mahout:/Core/src/main/java/org/Apache/mahout/CF/Taste/Hadoop/Item/RecommenderJob.Java%7C%7CRecommenderJob

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X