Comment déboguer hadoop mapreduce à partir d'eclipse?

Je suis à court d'hadoop dans une seule machine, uniquement local d'installation, et je suis à la recherche d'une belle, indolore pour déboguer les cartographes et les réducteurs dans eclipse. Eclipse a aucun problème à l'exécution de tâches mapreduce. Cependant, lorsque je vais pour le débogage, il me donne cette erreur :

12/03/28 14:03:23 AVERTIR mapred.JobClient: Pas de fichier jar jeu. Les classes de l'utilisateur ne peut pas être trouvé. Voir JobConf(Classe) ou JobConf#setJar(Chaîne de caractères).

Ok, donc je fais un peu de recherche. Apparemment, je devrais utiliser eclipse du débogage à distance des installations, et de l'ajouter à mon hadoop-env.sh :

-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000

Je le faire et je peux étape par le biais de mon code dans eclipse. Seul problème, c'est que, en raison de "suspendre=y", je ne peux pas utiliser le "hadoop" commande à partir de la ligne de commande pour faire des choses comme regarder la file d'attente de travail; il se bloque, j'imagine parce que c'est en attente d'un débogueur pour la fixer. Aussi, je ne peux pas courir "hbase shell" quand je suis dans ce mode, probablement pour la même raison.

Donc en gros, si je veux retourner en arrière et vient entre "mode debug" et "mode normal", j'ai besoin de mettre à jour hadoop-env.sh et redémarrer ma machine. Douleur importante. J'ai donc quelques questions :

  1. Est-il un moyen plus simple pour le débogage de tâches mapreduce dans eclipse?
  2. Comment se fait-eclipse peut exécuter mes tâches mapreduce très bien, mais pour le débogage j'ai besoin d'utiliser le débogage à distance?
  3. Est-il un moyen de dire à hadoop à utiliser le débogage à distance pour les tâches mapreduce, mais pour fonctionner en mode normal pour toutes les autres tâches? (comme "hadoop file d'attente" ou "hbase shell").
  4. Est-il un moyen plus facile pour passer hadoop-env.sh configurations sans avoir à redémarrer ma machine? hadoop-env.sh n'est pas exécutable par défaut.
  5. C'est une question plus générale : qu'est-ce qui se passe quand je lance hadoop en local uniquement, de mode? Il n'existe aucun processus sur ma machine qui sont "toujours" et de l'exécution de hadoop emplois? Ou ne hadoop seulement faire des choses quand je lance le "hadoop" commande à partir de la ligne de commande? Qu'est-ce que l'éclipse de faire lorsque j'exécute un travail de mapreduce à partir d'eclipse? J'avais pour référence hadoop-core dans mon pom.xml afin de faire mon travail du projet. Est eclipse envoyer des travaux à mon hadoop exemple, ou est-il en quelque sorte de course à partir de la hadoop-core-1.0.0.jar dans mon maven cache?

Ici est ma classe Principale :

public class Main {
      public static void main(String[] args) throws Exception {     
        Job job = new Job();
        job.setJarByClass(Main.class);
        job.setJobName("FirstStage");

        FileInputFormat.addInputPath(job, new Path("/home/sangfroid/project/in"));
        FileOutputFormat.setOutputPath(job, new Path("/home/sangfroid/project/out"));

        job.setMapperClass(FirstStageMapper.class);
        job.setReducerClass(FirstStageReducer.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(Text.class);

        System.exit(job.waitForCompletion(true) ? 0 : 1);
      }
}
En aparté, si vous êtes juste essayer de déboguer votre mapper / réducteur de logique, vous devriez regarder dans l'aide de MRUnit (cloudera.com/blog/2009/07/...)
@Chris White suggère de commencer avec MRUnit de test de Map/reduce logique est une bonne idée: incubator.apache.org/projects/mrunit.html

OriginalL'auteur sangfroid | 2012-03-28