Ich habe eine Pipeline, die ich derzeit auf einem großen Universitäts-Computer-Cluster laufen. Zu Veröffentlichungszwecken möchte ich es in mapreduce-Format konvertieren, so dass es von jedem Benutzer bei der Verwendung eines Hadoop-Clusters wie Amazon Webservices (AWS) ausgeführt werden kann. Die Pipeline besteht derzeit aus einer Reihe von Python-Skripten, die verschiedene binäre ausführbare Dateien umhüllen und die Eingabe und Ausgabe mithilfe der Module python subprocess und tempfile verwalten. Unglücklicherweise habe ich die ausführbaren Binärdateien nicht geschrieben, und viele von ihnen nehmen STDIN nicht oder geben STDOUT nicht in einer "verwendbaren" Weise aus (z. B. senden sie nur an Dateien). Aufgrund dieser Probleme habe ich die meisten davon in Python verpackt.Hadoop Streaming: Mapper 'eine Binärdatei ausführbar'
Bisher habe ich in der Lage gewesen, meinen Python-Code zu modifizieren, so dass ich eine Mapper und ein Reduktionsmittel, das ich auf meinem lokalen Rechner im Standard ausgeführt werden kann ‚Testformat.‘
$ cat data.txt | mapper.py | reducer.py
Der Mapper formatiert jede Datenzeile so, wie die Binärdatei, die sie umschließt, sie will, sendet den Text mit subprocess.popen an die Binärdatei (dies erlaubt mir auch, viele falsche STDOUT zu maskieren), sammelt dann den gewünschten STOUT und formatiert ihn in Zeilen für den Reduktor geeigneter Text. Die Probleme treten auf, wenn ich versuche, den Befehl in einer lokalen Hadoop-Installation zu replizieren. Ich kann den Mapper zur Ausführung bringen, aber es gibt einen Fehler, der darauf hindeutet, dass er die binäre ausführbare Datei nicht finden kann.
File "/Users/me/Desktop/hadoop-0.21.0/./phyml.py", line 69, in main() File "/Users/me/Desktop/hadoop-0.21.0/./mapper.py", line 66, in main phyml(None) File "/Users/me/Desktop/hadoop-0.21.0/./mapper.py", line 46, in phyml ft = Popen(cli_parts, stdin=PIPE, stderr=PIPE, stdout=PIPE) File "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/subprocess.py", line 621, in init errread, errwrite) File "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/subprocess.py", line 1126, in _execute_child raise child_exception OSError: [Errno 13] Permission denied
Mein hadoop Befehl sieht wie folgt aus:
./bin/hadoop jar /Users/me/Desktop/hadoop-0.21.0/mapred/contrib/streaming/hadoop-0.21.0-streaming.jar \
-input /Users/me/Desktop/Code/AWS/temp/data.txt \
-output /Users/me/Desktop/aws_test \
-mapper mapper.py \
-reducer reducer.py \
-file /Users/me/Desktop/Code/AWS/temp/mapper.py \
-file /Users/me/Desktop/Code/AWS/temp/reducer.py \
-file /Users/me/Desktop/Code/AWS/temp/binary
Wie ich oben erwähnt es mir sieht aus wie der Mapper nicht bekannt, die binär ist - vielleicht ist es nicht an den Rechenknoten gesendet werden ? Leider kann ich nicht wirklich sagen, was das Problem ist. Jede Hilfe würde sehr geschätzt werden. Es wäre besonders schön, einige in Python geschriebene Hadoop-Streaming-Mapper/Reducers zu sehen, die ausführbare Binärdateien umhüllen. Ich kann mir nicht vorstellen, dass ich der Erste bin, der das versucht! In der Tat ist hier eine andere Stelle im Wesentlichen die gleiche Frage, aber es wurde noch nicht beantwortet ...
Hadoop/Elastic Map Reduce with binary executable?
Es läuft sieht aus wie es ein Berechtigungsproblem sein kann. Anscheinend "verliert hadoop-streaming.jar" Dateiberechtigungen, wenn sie sie in die .jar-Dateien packt, die sie an die Rechenknoten sendet. Irgendwelche Vorschläge? –
Ok. Es gibt "einige" Informationen darüber, wie man das auf Amazon macht.http://developer.amazonwebservices.com/connect/thread.jspa?messageID=130482 –