2010-11-06 8 views
8

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?

+0

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? –

+0

Ok. Es gibt "einige" Informationen darüber, wie man das auf Amazon macht.http://developer.amazonwebservices.com/connect/thread.jspa?messageID=130482🶲 –

Antwort

4

Nach viel googeln (etc.) ich herausgefunden, wie ausführbare Binärdateien/scripts enthalten/Module, die für Ihre Mapper/Reducer zugänglich sind. Der Trick besteht darin, alle Ihre Dateien zuerst auf Hadoop hochzuladen.

$ bin/hadoop dfs -copyFromLocal /local/file/system/module.py module.py 

Dann brauchen Sie Sie Befehl wie die folgende Vorlage Streaming Format:

$ ./bin/hadoop jar /local/file/system/hadoop-0.21.0/mapred/contrib/streaming/hadoop-0.21.0-streaming.jar \ 
-file /local/file/system/data/data.txt \ 
-file /local/file/system/mapper.py \ 
-file /local/file/system/reducer.py \ 
-cacheFile hdfs://localhost:9000/user/you/module.py#module.py \ 
-input data.txt \ 
-output output/ \ 
-mapper mapper.py \ 
-reducer reducer.py \ 
-verbose 

Wenn Sie ein Python-Modul sind verknüpfen Sie den folgenden Code zu Ihrem Mapper/Reduktions Skripte hinzufügen müssen :

import sys 
sys.path.append('.') 
import module 

Wenn Sie etwas wie folgt aussehen eine binäre über Unterverarbeitungs Ihren Befehl zugreifst sollte:

cli = "./binary %s" % (argument) 
cli_parts = shlex.split(cli) 
mp = Popen(cli_parts, stdin=PIPE, stderr=PIPE, stdout=PIPE) 
mp.communicate()[0] 

Hoffe das hilft.

+0

Auch habe ich das nicht versucht, aber ich denke, dass der Streaming-Befehl vereinfacht werden kann, indem Sie alles zippen und den Befehl -cacheArchive verwenden. –

2

Verstanden schließlich

$pid = open2 (my $out, my $in, "./binary") or die "could not run open2"; 
+0

Ich habe das gleiche Problem, aber ich habe Probleme, Ihrer Lösung zu folgen, könnten Sie bitte klarstellen? – AlexIIP

Verwandte Themen