2016-04-30 13 views
1

Grundsätzlich würden in meinem Programm Aufgaben an eine HDFS-Datei angehängt werden. Ich möchte jedoch nicht, dass zwei Aufgaben die Datei gleichzeitig anhängen. Gibt es einen Mechanismus, bei dem nur eine Aufgabe an eine HDFS-Datei angehängt wird? Im Grunde eine Mutex-Art von Mechanismus. Ich brauche auch solche Mutex beim Erstellen der Datei.Gegenseitiger Schreibzugriff für HDFS-Datei?

+0

Welche Version von Spark verwenden Sie? –

+0

Ich benutze Spark 1.6 – pythonic

+0

andere Ergebnisse als Dataframe .. bitte halten Sie auf dem Laufenden. Ich würde gerne wissen, ob noch etwas anderes da ist. Thx –

Antwort

2

Nach meinem besten Wissen können Sie nicht mehr als einen Handler haben, der in die gleiche HDFS-Datei schreibt.

Dies ist keine Spark-Einschränkung, so ist HDFS konzipiert. In HDFS Dateien sind unveränderbar. Sie haben einen einzelnen Schreiber pro Datei und keine Anhänge, nachdem sie geschlossen wurden. Dies ist ideal für Big Data und Spark, da Sie immer wissen, dass die gleiche Datei zu den gleichen Daten führt.

Die Lösung in Hadoop ist, dass jeder Writer seine eigene Datei schreibt und dann einen endgültigen MapReduce-Job hat, um sie zu einer Datei zusammenzufügen (wenn dies wirklich etwas ist).

Die meiste Zeit können Sie nur mit diesen mehreren Dateien arbeiten. Der Trick besteht darin, den Ordner als Container zu haben; z. B. /a/b/people, wo der Personenordner viele verschiedene Dateien enthält, die jeweils unterschiedliche Untergruppen von "Personen" enthalten. Spark hat kein Problem damit, mehrere Dateien zu lesen und sie in denselben DataFrame oder RDD zu laden.

+0

Ihr zweiter Vorschlag, genau das mache ich, aber das Problem ist, dass ich Hunderte von Dateien kombinieren muss. Wenn das produzierende Teil nur eine Datei erstellt, hätte ich den Aufwand für das Lesen von so vielen Dateien im konsumierenden Teil reduziert. – pythonic

+1

Ich denke es gibt keinen Weg um HDFS zu benutzen. Sie können HBase alternativ dazu verwenden, um die Daten zu speichern, so dass Sie Daten nicht auf Dateiebene verwalten müssen. Oder Sie können alles in einer Warteschlange hinzufügen (sagen wir Kafka) und dann einen Leser haben, der aus dem Q liest und nur eine Datei erstellt. – marios

+0

@Marios: Es kann mit DataFrames nach spark 1.5 erreicht werden (wir haben das wie unten getan. Um unten Antwort zu erarbeiten, empfangen wir Nachrichten vom Nachrichtensystem für spezifische cobdate/business/env/so machen wir unsere Ordnerstruktur von HDFS wie cobdate/business/env/0-9 (partitionierte Ordner) in der Verschlussseite.In der Verarbeitungsseite laden wir diese partitionierten Ordner aus dem Datenrahmen, den wir nach Logik verarbeiten.Für ein bestimmtes Geschäft/cobdate/env gibt es mehrere Ordner 0-9 und konnte sie als Parkett-Avro-Dateien speichern (natürlich nicht 1 Datei) –

2

DataFrames in Spark1.5 und höher bieten die Möglichkeit, einen vorhandenen DF auf HDFS anzuhängen. Spark verwendet intern die von @marios in der anderen Antwort beschriebenen Techniken.

Zum Beispiel (in Java):

dataframe.write().mode(SaveMode.Append). 
    format(FILE_FORMAT).partitionBy("parameter1", "parameter2").save(path); 

Wenn Sie HDFS überprüfen werden Sie (Beispiel des Schreibens "Hallo") sehen:

-rw-r--r-- 3 vagrant supergroup   0 2016-05-13 17:48 /home/hello/_SUCCESS 
-rw-r--r-- 3 vagrant supergroup  281 2016-05-13 17:48 /home/hello/_common_metadata 
-rw-r--r-- 3 vagrant supergroup  2041 2016-05-13 17:48 /home/hello/_metadata 
-rw-r--r-- 3 vagrant supergroup  499 2016-05-13 17:46 /home/hello/part-r-00000-182e0b9b-a15d-47f9-8a3e-07739d6f2534.gz.parquet 
-rw-r--r-- 3 vagrant supergroup  499 2016-05-13 17:48 /home/hello/part-r-00000-a8cf0223-69b3-4c2c-88f6-91252d99967c.gz.parquet 
-rw-r--r-- 3 vagrant supergroup  499 2016-05-13 17:46 /home/hello/part-r-00001-182e0b9b-a15d-47f9-8a3e-07739d6f2534.gz.parquet 
-rw-r--r-- 3 vagrant supergroup  499 2016-05-13 17:48 /home/hello/part-r-00001-a8cf0223-69b3-4c2c-88f6-91252d99967c.gz.parquet 
-rw-r--r-- 3 vagrant supergroup  499 2016-05-13 17:46 /home/hello/part-r-00002-182e0b9b-a15d-47f9-8a3e-07739d6f2534.gz.parquet 
-rw-r--r-- 3 vagrant supergroup  499 2016-05-13 17:48 /home/hello/part-r-00002-a8cf0223-69b3-4c2c-88f6-91252d99967c.gz.parquet 
-rw-r--r-- 3 vagrant supergroup  499 2016-05-13 17:46 /home/hello/part-r-00003-182e0b9b-a15d-47f9-8a3e-07739d6f2534.gz.parquet 
-rw-r--r-- 3 vagrant supergroup  499 2016-05-13 17:48 /home/hello/part-r-00003-a8cf0223-69b3-4c2c-88f6-91252d99967c.gz.parquet 

Bitte verschiedene Möglichkeiten der Sparmodi siehe geeignet für Ihre Anforderung here

Wenn Sie Spark1.4 verwenden Bitte haben Blick in zu SaveMode doc

Verwandte Themen