Holen Sie sich eine Liste von Dateinamen von HDFS mit python
Hadoop-noob hier.
Ich gesucht habe für einige tutorials erste Schritte mit hadoop und python-ohne viel Erfolg. Ich brauche nicht zu arbeiten mit-Mapper und-Reduzierer noch, aber es ist eher ein access-Problem.
Als Teil des Hadoop-Clusters,
es gibt eine Reihe von .dat-Dateien auf dem HDFS.
Werden, um Zugriff auf die Dateien auf meinem client (lokaler computer) auf Basis von Python,
was benötige ich, um auf meinem computer?
Wie kann ich die Abfrage für den Dateinamen auf HDFS ?
Irgendwelche links wären auch hilfreich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie haben login Zugriff auf einen Knoten im cluster. Lassen Sie die Clusterverwaltung, wählen Sie den Knoten und setup das Konto und informieren Sie, wie auf die Knoten sicher. Wenn Sie der administrator sind, lassen Sie mich wissen, wenn der cluster ist lokal oder remote, und wenn remote dann ist es gehostet auf Ihrem computer, innerhalb eines Unternehmens oder auf eine 3rd-party-cloud-und wenn ja, deren und dann kann ich mehr relevanten Informationen.
Abfrage-Datei-Namen in HDFS, loggen Sie sich auf einem cluster-Knoten, und führen Sie
hadoop fs -ls [path]
. Pfad ist optional und wenn nicht angegeben, werden die Dateien in Ihrem home-Verzeichnis aufgeführt sind. Wenn-R
als option bereitgestellt wird, dann listet es alle Dateien im Pfad rekursiv. Es gibt zusätzliche Optionen für diesen Befehl. Für weitere Informationen über diese und andere Hadoop file system shell-Befehle finden Sie http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/FileSystemShell.html.Eine einfache Möglichkeit zur Abfrage HDFS-Datei-Namen in Python ist die Verwendung
esutil.hdfs.ls(hdfs_url='', recurse=False, full=False)
führthadoop fs -ls hdfs_url
in einem Teilprozess, plus es verfügt über Funktionen für eine Reihe von anderen Hadoop file system shell-Befehle (siehe die Quelle bei http://code.google.com/p/esutil/source/browse/trunk/esutil/hdfs.py). esutil installiert werden kann, mitpip install esutil
. Es wird auf PyPI zu https://pypi.python.org/pypi/esutil, Dokumentation es ist zu http://code.google.com/p/esutil/ und seiner GitHub-Seite ist https://github.com/esheldon/esutil.Müssen Sie Hadoop installiert und ausgeführt werden und natürlich Python.
Können Sie versuchen, so etwas wie dieses hier. Habe ich noch nicht getestet der code also nicht nur darauf verlassen.
Können Sie auch einen Blick auf Pydoop die eine Python-API für Hadoop.
Obwohl mein Beispiel
shell=true
, können Sie versuchen, ohne es, wie es ist ein Sicherheitsrisiko. Warum sollten Sie nicht verwendenshell=True
?Soweit ich in der Lage gewesen, zu sagen, es ist kein out-of-the-box-Lösung für dieses, und die meisten Antworten, die ich gefunden habe, gegriffen haben, um über Aufrufe zu den
hdfs
Befehl. Ich bin unter Linux, und habe die gleiche Herausforderung. Ich habe festgestellt, dassh
Paket, um nützlich zu sein. Diese Griffe ausführen von o/s-Befehle für Sie und die Verwaltung von stdin/out/err.Siehe hier für mehr info auf es: https://amoffat.github.io/sh/
Nicht die sauberste Lösung, aber es ist eine Zeile (ish) und verwendet standard-Pakete.
Hier ist mein cut-down-code zum packen eines HDFS-Verzeichnis-Auflistung. Es wird eine Liste von Dateien und Ordnern gleichermaßen, so müssen Sie möglicherweise ändern, wenn Sie brauchen, um Sie zu unterscheiden.
Meine Ausgabe - In diesem Fall sind das alle Verzeichnisse:
Let ' s break it down:
Laufen die
hdfs dfs -ls /somedirectory
Befehl können wir diesh
Paket wie dieses:sh
können Sie aufrufen, o/s-Befehle nahtlos, als seien Sie Funktionen auf dem Modul. Übergeben Sie Befehl Parameter als Parameter der Funktion. Wirklich ordentlich.Mir diese etwas zurückgibt, wie:
Aufgeteilt, die in Zeilen basierend auf neue-Zeile-Zeichen mit
.split('\n')
Erhalten, das Letzte 'Wort' in der Zeichenkette mit
line.rsplit(None,1)[-1]
.Um zu verhindern, dass Probleme mit leeren Elementen in der Liste verwenden
if len(line.rsplit(None,1))
Schließlich entfernen Sie das erste element in der Liste (die
Found 366 items
) mit[1:]