2012-03-28 12 views
14

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:

  1. Gibt es eine einfachere Möglichkeit, MapReduce-Jobs in Eclipse zu debuggen?

  2. Wie kommt es, dass Eclipse kann meine MapReduce-Jobs gut gehen, aber zum Debuggen muss ich Remote-Debugging verwenden?

  3. 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").

  4. 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.

  5. 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 meinem pom.xml verweisen, um mein Projekt arbeiten zu lassen. Gibt Eclipse Jobs an meine installierte Hadoop-Instanz weiter oder läuft es irgendwie von hadoop-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); 
     } 
} 
+3

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 –

+0

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 –

Antwort

1

Neben dem empfohlenen MRUnit Ich mag auch mit Eclipse debuggen. Ich habe ein Hauptprogramm. Es instanziiert eine Konfiguration und führt den MapReduce-Job direkt aus. Ich debugge nur mit Standard-Eclipse-Debug-Konfigurationen. Da ich in meiner mvn-Spezifikation Hadoop-Jars einschließe, habe ich alles in meinem Klassenpfad und muss es nicht gegen meinen installierten Hadoop ausführen. Ich teste immer mit kleinen Datensätzen in lokalen Verzeichnissen, um die Dinge einfach zu machen.Die Standardeinstellungen für die Konfiguration verhalten sich wie ein eigenständiges Hadoop (Dateisystem ist verfügbar)

+0

Danke für Ihre Antwort. Auch ich habe einen Hadoop-Core als Abhängigkeit in meinem POM eingerichtet. Da das der Fall ist, warum bekomme ich den Fehler "Kein Job jar file set"? Liegt es daran, dass ich einen Job anrufe?setJarByClass()? Könnten Sie bitte einen Beispielcode posten? – sangfroid

5

Die einzige Möglichkeit, Hadoop in Eclipse zu debuggen, besteht darin, Hadoop im lokalen Modus auszuführen. Der Grund dafür ist, dass jede Map den Task in der eigenen JVM reduziert und wenn Sie nicht im lokalen Modus arbeiten, kann Eclipse nicht debuggen.

Wenn Sie Hadoop im lokalen Modus festlegen, anstatt hdfs API (Standardeinstellung) zu verwenden, wird das Hadoop-Dateisystem in file:/// geändert. Daher wird die Ausführung hadoop fs -ls kein hdfs-Befehl sein, sondern mehr von hadoop fs -ls file:///, ein Pfad zu Ihrem lokalen Verzeichnis. Kein JobTracker oder NameNode wird ausgeführt.

könnten diese Blogeinträge helfen:

+0

Hallo @Kapil, Was du beschrieben hast, ist in Hadoop 2.4 (mit Garn, etc ..) möglich. Ich versuche, einen lokalen Job in Eclipse mit der neuen Version zu starten und mit 'Cluster kann nicht initialisiert werden. Bitte überprüfen Sie Ihre Konfiguration ... ' –

+0

@PedroDusso haben Sie lokale Debug bekommen, um mit Hadoop 2.4+ zu arbeiten? – erichfw

+0

@erichfw Ich habe es nie versucht ... Ich habe 2.2 in der Zeit benutzt, als ich diese Frage gestellt habe. –

0

Ich mag auch w/MRUnit über Unit-Test debuggen. Ich werde dies in Kombination mit Genehmigungstests verwenden, was eine einfache Visualisierung des Map Reduce-Prozesses ermöglicht und es einfach macht, fehlgeschlagene Szenarien zu übergeben. Es läuft auch nahtlos von Eclipse.

Zum Beispiel:

HadoopApprovals.verifyMapReduce(new WordCountMapper(), 
         new WordCountReducer(), 0, "cat cat dog"); 

Wird die Ausgabe produzieren:

[cat cat dog] 
-> maps via WordCountMapper to -> 
(cat, 1) 
(cat, 1) 
(dog, 1) 

-> reduces via WordCountReducer to -> 
(cat, 2) 
(dog, 1) 

Es gibt ein Video über den Prozess hier: http://t.co/leExFVrf

6

Bearbeite in /bin/hadoop (hadoop-env.sh) Skript. Überprüfen Sie, welcher Befehl ausgelöst wurde. Wenn der Befehl jar lautet, fügen Sie nur eine Remote-Debug-Konfiguration hinzu.

if [ "$COMMAND" = "jar" ] ; then 
    exec "$JAVA" -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8999 $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "[email protected]" 
else 
    exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS "[email protected]" 
fi 
+0

Ich habe das nicht genau versucht, aber ich habe $ JAVA durch jdb ersetzt (ich habe versucht, mit jdb zu debuggen). jdb hat den Haltepunkt, an dem ich das Programm stoppen wollte, nicht erkannt. Ich nehme an, das Problem war, dass ich nicht im lokalen Modus ausgeführt wurde. Ich habe es noch nicht ausprobiert, aber ich nehme an, Kapil D'Vorschlag ist, was ich folgen muss. –

+4

Sie könnten auch die Debugging-Optionen zu $ ​​HADOOP_OPTS var Ihrer Shell hinzufügen, ohne das Hadoop-Skript ändern zu müssen. exportieren HADOOP_OPTS = "$ HADOOP_OPTS-Xdebug-Xrunjdwp: Transport = dt_socket, Server = y, Adresse = 8999" –

2

Jumbunes Debugger wird all dies mit minimalem Aufwand tun.

Der Debugger bietet Statistiken zur Code-Flussstatistik des MapReduce-Jobs.

Der Benutzer kann Regex-Validierungen oder eigene benutzerdefinierte Validierungsklassen anwenden. Gemäß den angewandten Validierungen überprüft Flow Debugger den Datenfluss für Mapper bzw. Reducer.

Es bietet außerdem eine umfassende Tabellen-/Diagrammansicht, in der der Fluss der Eingabedatensätze auf Job-, MR- und Instanzebene angezeigt wird. Nicht übereinstimmende Schlüssel/Werte geben die Anzahl der fehlerhaften Schlüssel-/Wertdaten im Jobausführungsergebnis an. Debugger Bohrer nach unten in den Code, um den Datenfluss für verschiedene Zähler wie Schleifen und Bedingungen zu prüfen, ob, else-if usw.

Jumbune ist Open Source und erhältlich bei www.jumbune.org und https://github.com/impetus-opensource/jumbune