Viele Hadoop -Anfänger sind wahrscheinlich gleich. Da es nicht genügend Maschinenressourcen gibt, kann ich nur eine Pseudoverteilung von Hadoop erstellen, die in der virtuellen Maschine installiert sind. Dann verwende ich Eclipse oder Intellij IDEA in Win7, um Code -Tests zu schreiben. Die Frage ist also, wie Sie die Aufgaben aus der Ferne einstellen/reduzieren können, um das Debuggen von Hadoop und Breakpoint in Win7 zu entfernen?
1. Vorbereitung
1.1 In Win7 finden Sie ein Verzeichnis und dekomprimieren Sie Hadoop-2.6.0. In diesem Artikel d: /yangjm/code/study/hadoop/hadoop-2.6.0 (das Folgende wird durch $ hadoop_home dargestellt)
1.2 Fügen Sie mehrere Umgebungsvariablen in Win7 hinzu
Hadoop_home = d: /yangjm/code/study/hadoop/hadoop-2.6.0
Hadoop_bin_path =%Hadoop_Home%/bin
Hadoop_prefix = d: /yangjm/code/study/hadoop/hadoop-2.6.0
Darüber hinaus wird die Pfadvariable am Ende angehängt; %Hadoop_Home%/bin
2. Eclipse Remote Debugging
1.1 Download Hadoop-Eclipse-Plugin-Plugin
Hadoop-Eclipse-Plugin ist ein Hadoop-Plugin, das speziell für Eclipse verwendet wird, das den Verzeichnis und den Dateiinhalt von HDFs direkt in der IDE-Umgebung anzeigen kann. Der Quellcode wird auf GitHub gehostet und die offizielle Website-Adresse ist https://github.com/winghc/hadoop2x-eclipse-plugin
Wenn Sie interessiert sind, können Sie den Quellcode herunterladen und selbst kompilieren. Baidu wird viele Artikel aufnehmen, aber wenn Sie nur https://github.com/winghc/hadoop2x-eclipse-plugin/tree/master/release%20 verwenden, werden hier verschiedene kompilierte Versionen bereitgestellt. Verwenden Sie es einfach direkt. Kopieren Sie den heruntergeladenen Hadoop-Eclipse-Plugin-2.6.0.jar in das Verzeichnis eclipse/plugins und starten Sie dann Eclipse neu. Es ist alles fertig.
1.2 Laden Sie das Hadoop2.6-Plug-in-Paket für die Windows64-Bit-Plattform (Hadoop.dll, Winutils.exe) herunter
Unter Hadoop-Common-Project/Hadoop-Common/SRC/Main/Winutils im Quellcode Hadoop2.6.0 gibt es ein Vs.NET-Projekt. Das Kompilieren dieses Projekts kann diese Häufigkeit von Dateien und Ausgabedateien abrufen.
Hadoop.dll und Winutils.exe sind die nützlichsten. Kopieren Sie Winutils.exe in das Verzeichnis $ hadoop_home/Bin und kopieren Sie Hadoop.dll in das %Windir %/System32-Verzeichnis (hauptsächlich, um zu verhindern, dass das Plug-In verschiedene unerklärliche Fehler wie leere Objektreferenzen meldet).
Hinweis: Wenn Sie nicht kompilieren möchten, können Sie die kompilierte Datei Hadoop2.6 (x64) v0.2.rar direkt herunterladen
1.3 Konfigurieren des Hadoop-E-E-Eclipse-Plugin-Plugins
Starten Sie Eclipse, Windows-> View-> Andere
Fenster-> Einstellungen-> Hadoop-Karte/Reduzierung geben das Stammverzeichnis von Hadoop auf Win7 an (dh: $ hadoop_home)
Klicken Sie dann in der Karte des Karten-/Reduzierens auf das Symbol für Baby -Elefanten -Symbol
Fügen Sie einen Ort hinzu
Diese Schnittstelle ist sehr wichtig. Ich werde mehrere Parameter erklären:
Der Standortname ist nur ein Name. Rufen Sie ihn einfach an
MAP/Reduzierung (v2) Master -Host hier ist die IP -Adresse, die dem Hadoop -Master in der virtuellen Maschine entspricht. Der folgende Port entspricht dem vom Attribut dfs.datanode.ipc.address in HDFS-sit.xml angegebenen Port.
DFS-Master-Port: Der Port hier entspricht dem von Fs.DefaultFS in Core-Site.xml angegebenen Port
Der letzte Benutzername sollte mit dem Benutzernamen übereinstimmen, der Hadoop in der virtuellen Maschine ausführt. Ich installierte und lief Hadoop 2.6.0 mit Hadoop, also füllen Sie Hadoop hier aus. Wenn Sie es mit Root installiert haben, ändern Sie es entsprechend in Root.
Nachdem diese Parameter angegeben sind, klicken Sie auf Fertig stellen und in der Eclipse, um zu wissen, wie man eine Verbindung zu Hadoop herstellt. Wenn alles gut läuft, können Sie die Verzeichnisse und Dateien in HDFs im Project Explorer -Panel sehen.
Sie können mit der rechten Maustaste auf die Datei klicken und zum Versuchen löschen. Normalerweise ist das erste Mal erfolglos, und es wird viele Dinge geben. Die allgemeine Idee ist, dass es nicht genügend Berechtigungen gibt. Der Grund dafür ist, dass der aktuelle Win7 -Login -Benutzer nicht der laufende Benutzer von Hadoop in der virtuellen Maschine ist. Es gibt viele Lösungen. Sie können beispielsweise einen neuen Hadoop -Administratorbenutzer bei Win7 erstellen, dann zu Hadoop wechseln, um sich bei Win7 anzumelden, und dann Eclipse zur Entwicklung verwenden. Dies ist jedoch zu ärgerlich, der einfachste Weg:
Hinzufügen in HDFS-Site.xml
<Seigenschaft> <name> dfs.Permissions </name> <wert> false </value> </Eigenschaft>
Dann in der virtuellen Maschine hadoop dfsadmin -Safemode -Urlaub ausführen
Um sicher zu sein, ein weiterer Hadoop fs -chmod 777 /
Kurz gesagt, es soll die Sicherheitserkennung von Hadoop vollständig ausschalten (es besteht keine Notwendigkeit für diese in der Lernphase, tun Sie dies nicht, wenn sie offiziell erzeugt wird), starten Sie Hadoop schließlich neu, gehen Sie dann zu Eclipse und wiederholen Sie die Löschdatei -Operation jetzt und es sollte in Ordnung sein.
1.4 Erstellen eines WoldCount -Beispielprojekts
Erstellen Sie ein neues Projekt und wählen Sie MAP/Reduzierungsprojekt aus
Setzen Sie einfach als nächstes auf wodcount.java, der Code lautet wie folgt:
Paket yjmyzz; import java.io.ioException; import Java.util.stringTokenizer; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.path; org.apache.hadoop.io.intwritable; org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.mapper; import org.apache.hadoop.mapreduce.Reducer; org.apache.hadoop.util.genericOptionsParser; öffentliche Klasse WordCount {öffentliche statische Klassen -Tokenizermapper erweitert Mapper <Objekt, Text, Text, intRabitable> {private endgültige statische intRabitable One = new intWribleable (1); privates text word = neuer text (); public void map (Objektschlüssel, Textwert, Kontextkontext) löst IOException, InterruptedException aus {StringTokenizer itr = new StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {Word.set (itr.NextToken ()); context.write (Wort, eins); }}} public static class IntsumReDucer erweitert Reduzierer <Text, intRabitable, text, intwritable> {private intRable result = new intwrable (); public void recond (Textschlüssel, iterable <intRabitable> Werte, Kontextkontext) löst IOException, InterruptedException {int sum = 0; für (intwritable val: Werte) {sum += val.get (); } result.set (sum); context.write (Schlüssel, Ergebnis); }} public static void main (String [] args) löst eine Ausnahme aus {configuration conf = new configuration (); String [] otherArgs = neuer Generikoptionssparser (conf, args) .getRemainingArgs (); if (otherArgs.length <2) {System.err.println ("Verwendung: WordCount <in> [<in> ...] <Out>"); System.exit (2); } Job Job = Job.getInstance (conf, "Wortzahl"); Job.setJarByClass (WordCount.Class); Job.SetMapperClass (tokenizermpper.class); Job.SetCombinerClass (intsumReducer.class); Job.SetReDuCerClass (intsumReducer.Class); Job.SetoutputKeyClass (text.class); Job.SetoutputValueClass (intRable.class); für (int i = 0; i <otherArgs.length - 1; ++ i) {fileInputFormat.addinputPath (Job, neuer Pfad (otherArgs [i]); } FileOutputFormat.SetoutputPath (Job, neuer Pfad (andereArgs [andereArgs.length - 1])); System.exit (job.waitforCompletion (true)? 0: 1); }}Legen Sie dann ein log4j.properties ein, der Inhalt lautet wie folgt: (zum Laufen überprüfen verschiedene Ausgänge)
log4j.rootlogger = info, stdout#log4j.logger.org.springframework = info#log4j.logger.org.apache.activemq = info#log4j.logger.org.apache. activemq.spring = warn#log4j.logger.org.apache.activemq.store.journal = info#log4j.logger.org.apache.activemq.or g.activeio.journal = infolog4j.appender.stdout = org.apache.log4j.conoleAppenderLog4j.appender.stdout.layout = org.apache.log4j.patternLayoutLog4j.appender.stdout.conversionStumn =%d {Absoluation} | %-5,5p | %-16.16t | %-32,32c {1} | %-32,32C %4L | %m%nDie endgültige Verzeichnisstruktur lautet wie folgt:
Dann können Sie es ausführen, natürlich wird es nicht erfolgreich sein, da keine Parameter für WordCount eingegeben werden. Siehe die folgende Abbildung:
1.5 Betriebsparameter einstellen
Da WordCount eine Datei eingeben soll, um Wörter zu zählen und dann in einen anderen Ordner auszugeben, geben Sie also zwei Parameter an, beziehen Sie sich auf die obige Abbildung. Geben Sie in Programmargumente ein
HDFS: //172.28.20.xxx: 9000/jimmy/input/readme.txt
HDFS: //172.28.20.xxx: 9000/jimmy/output/output/
Bitte beachten Sie dies, um es zu ändern (ersetzen Sie die IP hauptsächlich durch die IP in Ihrem virtuellen Computer). Beachten Sie, dass, wenn die Datei "input/readm.txt" sie nicht hat, sie zuerst manuell hochladen und dann/Ausgabe/Darf nicht existieren dürfen. Andernfalls wird ein Fehler gemeldet, wenn das Programm bis zum Ende läuft und feststellt, dass das Zielverzeichnis vorliegt. Danach können Sie einen Haltepunkt in die entsprechende Position einstellen und endlich debuggen:
3.. Intellij Idea Remote Debugging Hadoop
3.1 Erstellen Sie ein Maven Wordcount -Projekt
Die POM -Datei lautet wie folgt:
<? xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>yjmyzz</groupId> <artifactId>mapreduce-helloworld</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-mapreduce-client-jobclient</artifactId> <version>2.6.0</version> </dependency> <dependency> <groupId>commons-cli</groupId> <artifactId>commons-cli</artifactId> <version>1.2</version> </dependency> </dependencies> <build> <Dendname> $ {project.artifactId} </finalName> </build> </project>Die Projektstruktur ist wie folgt:
Klicken Sie mit der rechten Maustaste auf das Projekt -> Moduleinstellungen öffnen oder drücken
Hinzufügen von Abhängigkeits -Libary -Referenzen
Importieren Sie dann alle entsprechenden Pakete unter $ hadoop_home
Die importierte Libary kann benannt werden, wie z. B. Hadoop2.6
3.2 Betriebsparameter einstellen
Beachten Sie zwei Orte :
1 ist Programmregime, die den Eclipes ähneln, die Eingabedateien und Ausgabeordner angeben
2 ist ein Arbeitsverzeichnis, dh das als Verzeichnis angegebene Arbeitsverzeichnis, in dem sich $ Hadoop_Home befindet
Dann kannst du debuggen
Das einzige, was unter Intellij unglücklich ist, ist, dass es kein Hadoop -Plugin gibt, das der Sonnenfinsternis ähnelt. Jedes Mal, wenn Sie WordCount ausführen, können Sie das Ausgabeverzeichnis nur manuell in der Befehlszeile löschen und dann debuggen. Um dieses Problem zu lösen, können Sie den WordCount -Code verbessern und das Ausgabeverzeichnis vor dem Ausführen löschen. Siehe den folgenden Code:
Paket yjmyzz; import Java.io.ioException; import Java.util.stringTokenizer; import org.apache.hadoop.conf.configuration; import org.apache.hadoop.fs.filesystem; import org .hadoop.fs.path; org.apache.hadoop.io.text; import org.apache.hadoop.mapreduce.job; import org.apache.hadoop.mapreduce.mapper; org.apache.hadoop.mapreduce.lib.output.FileOutputformat; import org.apache.hadoop.util.genericoptionParser; public class wordcount {public static class tokenizermapper erweitert Mapper <Objekt, Text, intwritable {privat endgültiges statisches statisches Intwrable eins = Neues Intwrible (1); privates text word = neuer text (); public void map (Objektschlüssel, Textwert, Kontextkontext) löst IOException, InterruptedException aus {StringTokenizer itr = new StringTokenizer (value.toString ()); while (itr.hasmoretokens ()) {Word.set (itr.NextToken ()); context.write (Wort, eins); }}} public static class IntsumReDucer erweitert Reduzierer <Text, intRabitable, text, intwritable> {private intRable result = new intwrable (); public void recond (Textschlüssel, iterable <intRabitable> Werte, Kontextkontext) löst IOException, InterruptedException {int sum = 0; für (intwritable val: Werte) {sum += val.get (); } result.set (sum); context.write (Schlüssel, Ergebnis); }} / ** * Löschen Sie das angegebene Verzeichnis * * @param conf * @param DirPath * @throws ioException * / private static void deletedir (configuration conf, String DirPath) löst IOException {Dateisystem fs = fileSYSTEM.get (conf) aus; Pfad targetPath = neuer Pfad (Dirath); if (fs. exists (targetPath)) {boolean delresult = fs.delete (targetPath, true); if (delresult) {System.out.println (TargetPath + "wurde erfolgreich gelöscht."); } else {system.out.println (targetPath + "Deletion fehlgeschlagen."); }}} public static void main (String [] args) löst eine Ausnahme aus {configuration conf = new configuration (); String [] otherArgs = neuer Generikoptionssparser (conf, args) .getRemainingArgs (); if (otherArgs.length <2) {System.err.println ("Verwendung: WordCount <in> [<in> ...] <Out>"); System.exit (2); } // das Ausgabesverzeichnis zuerst deletedir löschen (conf, otherArgs [otherArgs.length - 1]); Job Job = Job.getInstance (conf, "Wortzahl"); Job.setJarByClass (WordCount.Class); Job.SetMapperClass (tokenizermpper.class); Job.SetCombinerClass (intsumReducer.class); Job.SetReDuCerClass (intsumReducer.Class); Job.SetoutputKeyClass (text.class); Job.SetoutputValueClass (intRable.class); für (int i = 0; i <otherArgs.length - 1; ++ i) {fileInputFormat.addinputPath (Job, neuer Pfad (otherArgs [i]); } FileOutputFormat.SetoutputPath (Job, neuer Pfad (andereArgs [andereArgs.length - 1])); System.exit (job.waitforCompletion (true)? 0: 1); }} Aber das ist nicht genug. Wenn Sie in der IDE-Umgebung ausgeführt werden, muss die IDE wissen, zu welcher HDFS-Instanz eine Verbindung hergestellt werden soll (wie in der DB-Entwicklung, Sie müssen die DataSource in der Konfiguration XML angeben), kopieren Sie die Core-Site.xml unter $ hadoop_home/etc/hadoop in das Ressourcenverzeichnis, ähnlich wie folgt:
Der Inhalt ist wie folgt:
<xml Version = "1.0" coding = "utf-8"?> <xml-Stylesheet type = "text/xsl" href = "configuration.xsl"?
Ersetzen Sie einfach die IP oben durch die IP im virtuellen Computer.