Ich habe eine Pipeline, die ich derzeit auf einem großen Universitätscomputercluster betreibe. Zu Veröffentlichungszwecken möchte ich es in mapreduce-Format konvertieren, so dass es von jedem 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). Diese Probleme sind, warum ich die meisten von ihnen in Python verpackt habe.
Bisher war ich in der Lage, meinen Python-Code so zu ändern, dass ich einen Mapper und einen Reducer habe, den ich auf meinem lokalen Rechner im Standard-Testformat ausführen kann.
%Vor%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 (das erlaubt mir auch, viele falsche STDOUT zu maskieren), dann sammelt ich den STOUT, und formatiert es in Textzeilen, die für den Reduzierer geeignet sind. Die Probleme treten auf, wenn ich versuche, den Befehl bei 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.
Datei "/Users/me/Desktop/hadoop-0.21.0/./phyml.py", Linie 69, in main () Datei "/Users/me/Desktop/hadoop-0.21.0/.mapper.py", Linie 66, in Haupt phyml (None) Datei "/Users/me/Desktop/hadoop-0.21.0/.mapper.py", Linie 46, in Phyml ft = Popen (cli_parts, stdin = PIPE, stderr = PIPE, stdout = PIPE) Datei "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/subprocess.py", Zeile 621, in init errread, errrrite) Datei "/Library/Frameworks/Python.framework/Versions/6.1/lib/python2.6/subprocess.py", Zeile 1126, in _execute_child erhöhe child_exception OSError: [Errno 13] Berechtigung verweigert
Mein hadoop-Befehl sieht folgendermaßen aus:
%Vor%Wie ich oben bemerkt habe, sieht es für mich so aus, als ob der Mapper die Binärdatei nicht kennt - vielleicht wird sie nicht an den Rechenknoten gesendet? 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, hier ist ein weiterer Beitrag im Wesentlichen die gleiche Frage, aber es wurde noch nicht beantwortet ...
Nach vielem Googeln (usw.) habe ich herausgefunden, wie ausführbare Binärdateien / Skripte / Module, die für Ihre Mapper / Reducer zugänglich sind, eingebunden werden können. Der Trick besteht darin, alle Ihre Dateien zuerst auf Hadoop hochzuladen.
%Vor%Dann müssen Sie Ihren Streaming-Befehl wie die folgende Vorlage formatieren:
%Vor%Wenn Sie ein Python-Modul verknüpfen, müssen Sie Ihren Mapper / Reducer-Skripten den folgenden Code hinzufügen:
%Vor%Wenn Sie über Subprocessing auf eine Binärdatei zugreifen, sollte Ihr Befehl etwa so aussehen:
%Vor%Hoffe, das hilft.