Lancement d'un travail de mapreduce à partir d'eclipse.
J'ai écrit un programme mapreduce en Java, ce qui je peux envoyer à distance à un cluster en cours d'exécution en mode distribué. Actuellement, je présenter la tâche à l'aide des étapes suivantes:
- exporter la mapreuce travail comme un pot (par exemple
myMRjob.jar
) - soumettre le travail à distance cluster à l'aide de la commande shell suivante:
hadoop jar myMRjob.jar
Je voudrais vous présenter le travail directement à partir de l'Éclipse lorsque j'essaie d'exécuter le programme. Comment puis-je faire cela?
Je suis actuellement en utilisant CDH3, et une version abrégée de ma conf est:
conf.set("hbase.zookeeper.quorum", getZookeeperServers());
conf.set("fs.default.name","hdfs://namenode/");
conf.set("mapred.job.tracker", "jobtracker:jtPort");
Job job = new Job(conf, "COUNT ROWS");
job.setJarByClass(CountRows.class);
//Set up Mapper
TableMapReduceUtil.initTableMapperJob(inputTable, scan,
CountRows.MyMapper.class, ImmutableBytesWritable.class,
ImmutableBytesWritable.class, job);
//Set up Reducer
job.setReducerClass(CountRows.MyReducer.class);
job.setNumReduceTasks(16);
//Setup Overall Output
job.setOutputFormatClass(MultiTableOutputFormat.class);
job.submit();
Lorsque je l'exécute directement à partir d'Eclipse, le travail est lancé, mais Hadoop ne peut pas trouver les mappeurs/réducteurs. J'obtiens les erreurs suivantes:
12/06/27 23:23:29 INFO mapred.JobClient: map 0% reduce 0%
12/06/27 23:23:37 INFO mapred.JobClient: Task Id : attempt_201206152147_0645_m_000000_0, Status : FAILED
java.lang.RuntimeException: java.lang.ClassNotFoundException: com.mypkg.mapreduce.CountRows$MyMapper
at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:996)
at org.apache.hadoop.mapreduce.JobContext.getMapperClass(JobContext.java:212)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:602)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:323)
at org.apache.hadoop.mapred.Child$4.run(Child.java:270)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:396)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127)
at org.apache.hadoop.mapred.Child.main(Child.java:264)
...
Personne ne sait comment les obtenir au-delà de ces erreurs? Si je peux résoudre ce problème, je peux intégrer plus M. emplois dans mes scripts qui serait génial!
Lorsque vous soumettez le travail au sein d'Eclipse, sont le mappeur / réducteur de classes dans le même projet, ou est le pot contenant sur le chemin de classe et les classes elles-mêmes nulle part ailleurs sur le cp?
La classe contenant tout ce qui est appelé CountRows. Cette classe contient une 'main' méthode qui définit le travail de configurations. le CountRows classe contient également de la classe pour le mappeur et réducteur appelé MyMapper et MyReducer respectivement. Le travail fonctionne bien comme je l'ai dit lorsque je lance le travail à partir de la comandline par écrit "hadoop jar CountRows.jar'
Ce n'est pas ma question, lorsque vous soumettez le travail dans Eclipse est l'CountRows.jar sur le chemin de classe, ou êtes-vous de soumettre le travail à partir de l'intérieur de la CountRows projet (d'où les fichiers de classe ne sont pas regroupés dans un bocal)
Je suis de soumettre le travail à partir de l'intérieur le nombre de Lignes du projet.
OriginalL'auteur Tucker | 2012-06-27
Vous devez vous connecter pour publier un commentaire.
Si vous êtes à la soumission de la tâche hadoop de l'intérieur le projet Eclipse qui définit les classes, alors vous avez probablement un problème de classpath.
La
job.setjarByClass(CountRows.class)
appel est de trouver le fichier de classe sur la construction de chemin de classe, et non dans le CountRows.jar (qui peut ou peut ne pas avoir encore été créé, ou même sur le chemin de la classe).Vous devriez être en mesure de faire valoir ce qui est vrai par l'impression du résultat de
job.getJar()
après l'appel dejob.setjarByClass(..)
, et si il n'affiche pas un pot de chemin d'accès, puis il a trouvé de la construction de la classe, plutôt que le pot avait de la classeEh bien, c'est pas étonnant vu que vous demandez à la classe de type de Travail. Essayez
job.getJar()
plutôt quejob.getClass()
Ha, votre bouton droit de la mauvaise méthode! J'ai couru aujourd'hui, il dit à ses null. Est-il un moyen de le faire fonctionner quand je lance le programme par le biais de l'éclipse?
Ok, cela a fonctionné! J'ai ajouté ` conf.("mapred.jar","/path/to/my/jar/CountRows.jar"); " Si il n'y a pas moyen de courir la carte de réduire l'emploi dans eclipse sans avoir à exporter le MR de la classe à partir d'Eclipse dans son propre pot et de le spécifier dans la configuration d'un travail comme ci-dessus?
Pas que je sache, à moins que le pot est déjà dans HDFS, vous devez obtenir les classes le jobtracker d'une certaine façon, et dans un seul Pot est la méthode actuelle, donc non.
OriginalL'auteur Chris White
Ce qui a fonctionné pour moi a été l'exportation d'un runnable JAR (la différence entre elle et un BOCAL, c'est que le premier définit la classe, qui est la méthode principale) et sélectionnez l'option "emballage bibliothèques requises dans le POT" de l'option (en cliquant sur "extraire..." option conduit à dupliquer des erreurs et il a aussi pour extraire les fichiers de classe de les pots, ce qui, en fin de compte, dans mon cas, entraîné la non-résolution de la classe ne trouve pas d'exception).
Après, vous pouvez simplement mettre le pot, comme il a été suggéré par Chris White. Pour Windows, il devrait ressembler à ceci:
job.setJar("C:\\\MyJar.jar");
Si ça aide quelqu'un, je fait un exposé sur ce que j'ai appris de la création d'un MapReduce projet et de son exécution dans Hadoop 2.2.0 dans Windows 7 (dans Eclipse Luna)
OriginalL'auteur Peeter Kokk
J'ai utilisé cette méthode sur le site web suivant pour configurer une Carte/Réduire le projet de mine à exécuter le projet à l'aide d'Eclipse (w/o exporter un projet que le POT)
La configuration d'Eclipse pour exécuter Hadoop Map/reduce projet
Remarque: Si vous décidez de déboguer votre programme, votre
Mapper
classe etReducer
classe ne sera pas debug-mesure.Espère que cela aide. 🙂
Vous avez dit "Si vous décidez de déboguer votre programme, votre Mappeur de classe et Réducteur de classe ne sera pas debug-mesure." pourquoi est-ce et est-il toujours vrai?
OriginalL'auteur Kshirsagar Naidu