2

Ich werde eine große Menge an Dateien strukturiert werden wie folgt verwendet:Spark-Partitionierung/cluster Durchsetzung

/day/hour-min.txt.gz 

mit insgesamt 14 Tage. Ich werde einen Cluster von 90 Knoten/Arbeitern verwenden.

Ich lese alles mit wholeTextFiles(), da es die einzige Möglichkeit ist, die es mir erlaubt, die Daten entsprechend zu teilen. Alle Berechnungen werden pro Minute durchgeführt (also grundsätzlich pro Datei) und einige wenige Schritte am Ende. Es gibt ungefähr 20.000 Dateien; Wie man sie effizient partitioniert? Soll ich Funken entscheiden lassen?

Idealerweise denke ich, jeder Knoten sollte ganze Dateien erhalten; macht Funken das standardmäßig? Kann ich es durchsetzen? Wie?

+0

Wo befinden sich Ihre Eingabedateien? HDFS/S3/..? –

+0

HDFS Dimebag

Antwort

2

Ich denke, jeder Knoten sollte ganze Dateien erhalten; macht Funken das standardmäßig?

Ja, da WholeTextFileRDD (was Sie nach sc.wholeTextFiles bekommen) WholeTextFileInputFormat seine eigenen hat die ganzen Dateien als einen einzelnen Datensatz zu lesen, sind Sie abgedeckt. Wenn Ihre Spark-Executoren und Datenknoten gemeinsam lokalisiert sind, können Sie auch Knoten lokale Datenlokalität erwarten. (Sie können diese UI Spark überprüfen, sobald Ihre Anwendung ausgeführt wird.)

Ein Wort der Vorsicht aus Anmerkung Spark Dokumentation für sc.wholeTextFiles withing:

Kleine Dateien werden bevorzugt, große Datei auch zulässig ist, aber kann schlechte Leistung verursachen.

+0

Nur um klar zu sein, meinst du, ich sollte mein eigenes 'wholeTextFileInputFormat' implementieren? Oder ist die Standardimplementierung gut? – Dimebag

+1

Nein, Sie müssen hierfür kein eigenes Eingabeformat implementieren. Es ist bereits zur Verfügung gestellt. Denken Sie daran, dass, wenn Ihre Datei groß ist, sie wahrscheinlich auf viele hdfs-Blöcke aufgeteilt wird und Ihre RDD diese Blöcke (möglicherweise von nicht-lokalen Datenknoten) lesen muss, um einen einzelnen Datensatz für eine Datei zu erstellen.Auch für große Dateien wird der Speicher groß sein, der benötigt wird, um eine einzelne Datei zu verarbeiten. Dies ist der Grundgedanke hinter der Vorsicht gegenüber der Verwendung von Ganztextdateien für große RDDs. Ansonsten bist du ziemlich bedeckt. –

1

Sie könnten die Daumenregel für Ihre Partitionen verwenden:

data = data.coalesce(total_cores * 3) 

Idealerweise denke ich, jeder Knoten ganze Dateien empfangen sollte; macht Funken das standardmäßig? Kann ich es durchsetzen? Wie?

Es hängt alles von Ihrer RDD, nicht von Ihren Dateien ab. Wenn Sie beispielsweise eine RDD erstellen, die den gesamten Inhalt der Dateien enthält, verteilt Spark diese RDD, und ob eine ganze Datei in einem Knoten liegt, wird von vielen Parametern beeinflusst (Anzahl der Partitionen, Größe jeder Datei usw.).

Ich glaube nicht, dass Sie so etwas erzwingen können, also konzentrieren Sie sich auf die Anzahl der Partitionen; Das ist kritisch.


Was die Anzahl der Dateien, hatte ich in meinem pseudosite geschrieben, dass zu wenige Dateien, in großen Dateien führen und kann einfach zu groß, zu viele Dateien und Sie werden HDFS eine riesige Menge beibehalten haben von Metadaten, die so viel Druck machen.

Verwandte Themen