Ich benutze Hadoop in einer Single-Machine, nur lokale Setup, und ich bin auf der Suche nach einer schönen, schmerzlosen Möglichkeit, Mapper und Reducer in Eclipse zu debuggen. Eclipse hat kein Problem beim Ausführen von MapReduce-Aufgaben. Jedoch, wenn ich zum debuggen gehe, gibt es mir diesen Fehler:Wie Debuggen Hadoop Map Reduce Jobs von Eclipse?
12/03/28 14:03:23 WARN mapred.JobClient: Kein Job jar Dateisatz. Benutzerklassen werden möglicherweise nicht gefunden. Siehe JobConf (Klasse) oder JobConf # setJar (String).
Okay, also mache ich ein wenig Nachforschungen. Offenbar sollte ich Eclipse Remote-Debugging-Anlage verwenden, und fügen Sie diese zu meinen hadoop-env.sh
:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5000
ich das tun und ich kann meinen Code in Eclipse für Schritt durch. Das einzige Problem ist, dass ich wegen des "suspend = y" den "hadoop" -Befehl von der Befehlszeile aus nicht verwenden kann, um Dinge wie die Job-Warteschlange zu betrachten; Es hängt, ich stelle mir vor, weil es darauf wartet, dass ein Debugger angeschlossen wird. Außerdem kann ich "hbase shell" nicht ausführen, wenn ich in diesem Modus bin, wahrscheinlich aus dem gleichen Grund.
Also im Grunde, wenn ich zwischen "Debug-Modus" und "normalen Modus" hin und her Flip wollen, muss ich hadoop-env.sh
aktualisieren und starten Sie meine Maschine neu. Große Schmerzen. Also habe ich ein paar Fragen:
Gibt es eine einfachere Möglichkeit, MapReduce-Jobs in Eclipse zu debuggen?
Wie kommt es, dass Eclipse kann meine MapReduce-Jobs gut gehen, aber zum Debuggen muss ich Remote-Debugging verwenden?
Gibt es eine Möglichkeit, Hadoop mitzuteilen, das Remote-Debugging für mapreduce-Jobs zu verwenden, aber im normalen Modus für alle anderen Aufgaben zu arbeiten? (z. B. "Hadoop-Warteschlange" oder "HBase-Shell").
Gibt es eine einfachere Möglichkeit,
hadoop-env.sh
Konfigurationen zu wechseln, ohne meinen Rechner neu zu starten? hadoop-env.sh ist standardmäßig nicht ausführbar.Dies ist eine allgemeinere Frage: Was genau passiert, wenn ich im Local-Only-Modus hadoop starte? Gibt es Prozesse auf meiner Maschine, die "immer an" sind und Hadoop-Jobs ausführen? Oder macht Hadoop nur Dinge, wenn ich den "hadoop" -Befehl von der Kommandozeile aus starte? Was macht Eclipse, wenn ich einen MapReduce-Job von Eclipse aus starte? Ich musste
hadoop-core
in meinempom.xml
verweisen, um mein Projekt arbeiten zu lassen. Gibt Eclipse Jobs an meine installierte Hadoop-Instanz weiter oder läuft es irgendwie vonhadoop-core-1.0.0.jar
in meinem Maven-Cache?
Hier ist meine Hauptklasse:
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);
}
}
Als beiseite, wenn Sie nur versuchen, Ihre Mapper/Reducer-Logik zu debuggen, sollten Sie sich mit MRUnit (http://www.cloudera.com/blog/2009/07/debugging-mapreduce-programs-with-mrunit/) befassen –
Wie @Chris White vorschlägt, mit MRUnit zu beginnen, Map/Reduce-Logik zu testen, ist eine gute Idee: http://incubator.apache.org/projects/mrunit.html –