Ich dachte, dass das Laden von Textdateien nur von Arbeitern / innerhalb des Clusters ausgeführt wird (Sie müssen nur sicherstellen, dass alle Worker Zugriff auf denselben Pfad haben, entweder durch die Bereitstellung dieser Textdatei auf allen Knoten oder durch die Verwendung von shared) Ordner, der demselben Pfad zugeordnet ist)
z.B. spark-submit
/ spark-shell
kann von überall gestartet werden und stellt eine Verbindung zu einem Funken-Master und dem Computer her, auf dem Sie spark-submit
/ spark-shell
gestartet haben (wo auch unser Treiber ausgeführt wird, es sei denn, Sie befinden sich in "cluster") Modus) hat nichts mit dem Cluster zu tun. Daher sollte jedes Laden von Daten nur von den Arbeitern erfolgen, nicht von der Treibermaschine, richtig? z.B. es sollte keine Möglichkeit geben, dass sc.textFile("file:///somePath")
dazu führt, dass spark auf dem Treiber Rechner nach einer Datei sucht (der Treiber befindet sich wiederum außerhalb des Clusters, zB im "Client" Deploy Mode / Standalone Modus) , oder?
Nun, das ist, was ich auch dachte ...
Unsere Besetzung
Akt I - Die Hoffnung
Wenn ich eine Funkenschale von Maschine B aus starte, um Master auf B zu funken, bekomme ich folgendes:
%Vor%Akt II - Der Konflikt
Aber wenn ich eine Funkenschale von Maschine A starte und auf Funkenmeister auf B zeige, bekomme ich Folgendes:
%Vor% Und tatsächlich existiert /tmp/data/myfile.csv
nicht auf Maschine A, aber Maschine A ist nicht auf dem Cluster, sondern nur dort, wo der Treiber läuft
Akt III - Die Verwunderung
Was noch seltsamer ist, ist, dass wenn ich diese Datei auf Maschine A verfügbar mache, diese Fehlermeldung nicht mehr auftritt. (Stattdessen erstellt es einen Job, aber keine Aufgaben und scheitert nur an einer Zeitüberschreitung, was ein weiteres Problem ist, das eine separate Frage verdient).
Gibt es etwas in der Art, dass sich Spark benimmt, dass ich vermisse? Ich dachte, dass die Funkenhülle, wenn sie mit einer Fernbedienung verbunden ist, nichts mit der Maschine zu tun hat, auf der Sie laufen. Warum stoppt der Fehler, wenn ich diese Datei auf Maschine A verfügbar mache? Das bedeutet, dass der Speicherort von sc.textFile den Ort enthält, an dem spark-shell oder spark-submit initiiert wurde (in meinem Fall auch, wo der Treiber ausgeführt wird)? Das macht für mich keinen Sinn. aber ich bin wieder offen für neue Dinge.
Epilog
tl; dr - sc.textFile ("file: / somePath") läuft von einem Treiber auf Maschine A zu einem Cluster auf Maschinen B, C, D ... (Treiber nicht Teil des Clusters)
Es sieht so aus, als suche es nach Pfad file: / somePath auch nach dem Treiber, ist das wahr (oder ist es nur ich)? ist das bekannt? ist das wie geplant?
Ich habe das Gefühl, dass dies ein merkwürdiges Netzwerk- / VPN-Topologie-Problem ist, das nur in meinem Arbeitsplatznetzwerk auftritt, aber trotzdem passiert mir das und ich bin völlig verwirrt, ob es nur ich oder ein bekanntes Verhalten ist. (oder ich verstehe einfach nicht, wie Spark funktioniert, was immer eine Option ist)
Also die wirklich kurze Version der Antwort ist, wenn Sie auf "file: // ..." verweisen, sollte es auf allen Knoten in Ihrem Cluster einschließlich des dirver-Programms zugänglich sein. Manchmal passieren einige Arbeiten am Arbeiter. In der Regel verwenden Sie keine lokalen Dateien und verwenden stattdessen etwas wie S3, HDFS oder ein anderes Netzwerk-Dateisystem. Es gibt die Methode sc.addFile
, die verwendet werden kann, um eine Datei vom Treiber an alle anderen Knoten zu verteilen (und dann verwenden Sie SparkFiles.get
, um den Download-Speicherort aufzulösen).
Spark kann sowohl lokal als auch auf HDFS nach Dateien suchen.
Wenn Sie eine Datei mit sc.textFile () einlesen und das RDD-Format nutzen möchten, sollte die Datei auf HDFS stehen. Wenn Sie nur eine Datei in der normalen Weise einlesen möchten, ist dies dasselbe wie bei der API (Scala, Java, Python).
Wenn Sie eine lokale Datei mit Ihrem Treiber senden, verteilt addFile () die Datei an jeden Knoten und SparkFiles.get () lädt die Datei in eine lokale temporäre Datei.
Tags und Links apache-spark