sudo -u hdfs hadoop fs -mkdir /user/joerg
sudo -u hdfs hadoop fs -chown joerg /user/joerg
Und eine Umgebungsvariable in ~/.bashrc hinzufügen
export HADOOP_MAPRED_HOME=/usr/lib/hadoop-mapreduce
Endlich Wörter zählen!
Und wir sind endlich soweit, unser Beispiel vom letzten Mal ausführen zu können. Wir verwenden dazu Hadoop Streaming. Um das “eigentliche” MapReduce zu verwenden, müssten wir Code in Java schreiben, und nach der schmerzhaften Installation wollen wir das nun nicht auch noch. Daher übernimmt das Hadoop Streaming jetzt, was wir vorher in der Shell von Hand gemacht haben: Den input über stdin an einen Mapper füttern, die Ausgabe sortieren, und an die Reducer verteilen. Dann den output in HDFS abspeichern, und zwar in einer Datei je Reducer.
Theoretisch, hätten wir eine echte Serverinstallation von Hadoop, könnten wir jetzt beliebig viele Computer als Mapper einsetzen, und auch als Reducer. Unser Code ist frei skalierbar geworden, und dank HDFS auch unsere Datenspeicherkapazität.
Wenn wir map.py und reduce.py vom letzten Mal verwenden wollen, müssen wir noch als erste Zeile in jedem dieser Skripte
#!/usr/bin/python
ergänzen und Ausführrechte setzen:
chmod a+x map.py reduce.py
Streaming erhält als Parameter die Skripte für mapper und reducer, und mit dem -file Parameter die Dateien die verschickt werden sollen und auf JEDEM Rechner landen. Die Eingabedatei ist aber sehr groß (jedenfalls wenn wir MapReduce ernsthaft für Big Data einsetzen), und daher verteilt auf dem HDFS. Dazu kopieren wie die Eingabedatei ins HDFS. Ich habe hier den Volltext von Moby Dick, aber ihr könnt eine beliebige Textdatei nehmen.
hadoop fs -copyFromLocal pg2701.txt .
Zeit, den Streaming-Job zu starten. Stellt sicher, dass ihr keine Fehlermeldungen seht, Warnungen kann man im allgemeinen ignorieren.
hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar -mapper map.py -reducer reduce.py -input /user/joerg/pg2701.txt -output /user/joerg/output -file ./map.py -file ./reduce.py
Die Ausgabedatei liegt jetzt im HDFS. Ihr könnt sie zurückkopieren. Für jeden Reducer wird es eine Datei geben, aber da wir nur einen verwendet haben, ist die Datei part-r-00000 im Ausgabeordner. Mit cat könnt ihr sie ausgeben lassen und das Resultat der harten Installationsarbeit bewundern:
hadoop fs -copyToLocal /user/joerg/output .
cat output/part-r-00000
Bevor ihr erneut streamen könnt, müsst ihr den Ausgabeordner im HDFS löschen:
hadoop fs -rm -r /user/joerg/output
Herzlichen Glückwunsch! Jetzt habt ihr ein funktionierendes MapReduce-Framework, und beim nächsten Mal können wir uns näher mit den Kommandozeilenparametern für Streaming beschäftigen und ein neues Problem lösen.
Kommentare (2)