Laut Learning Spark
Beachten Sie, dass die Neupartitionierung Ihrer Daten ein ziemlich teurer Vorgang ist. Spark hat auch eine optimierte Version von
repartition()
aufgerufencoalesce()
, mit der Datenverschiebungen vermieden werden können, jedoch nur, wenn Sie die Anzahl der RDD-Partitionen verringern.
Ein Unterschied, den ich bekomme, ist, dass mit repartition()
der Anzahl der Partitionen erhöht / verringert werden kann, aber mit coalesce()
der Anzahl der Partitionen kann nur verringert werden.
coalesce()
Wie kann eine Datenverschiebung vermieden werden, wenn die Partitionen auf mehrere Computer verteilt sind und ausgeführt werden?
quelle
minimize data movement
alsavoiding data movement
.repartition
verwendet werden solltecoalesce
?repartition
aufgerufen wird . Lassen Sie mich wissen, ob das hilft.coalesce
shuffle
shuffle = true
Justins Antwort ist großartig und diese Antwort geht tiefer.
Der
repartition
Algorithmus mischt vollständig und erstellt neue Partitionen mit Daten, die gleichmäßig verteilt sind. Erstellen wir einen DataFrame mit den Zahlen 1 bis 12.numbersDf
enthält 4 Partitionen auf meinem Computer.So werden die Daten auf die Partitionen aufgeteilt:
Lassen Sie uns die
repartition
Methode vollständig mischen und diese Daten auf zwei Knoten abrufen.So werden die
numbersDfR
Daten auf meinem Computer partitioniert:Die
repartition
Methode erstellt neue Partitionen und verteilt die Daten gleichmäßig in den neuen Partitionen (die Datenverteilung ist bei größeren Datenmengen gleichmäßiger).Unterschied zwischen
coalesce
undrepartition
coalesce
Verwendet vorhandene Partitionen, um die Datenmenge zu minimieren, die gemischt wird.repartition
Erstellt neue Partitionen und mischt vollständig.coalesce
Dies führt zu Partitionen mit unterschiedlichen Datenmengen (manchmal Partitionen mit sehr unterschiedlichen Größen) undrepartition
zu ungefähr gleich großen Partitionen.Ist
coalesce
oderrepartition
schneller?coalesce
läuft möglicherweise schneller alsrepartition
, aber Partitionen mit ungleicher Größe arbeiten im Allgemeinen langsamer als Partitionen mit gleicher Größe. Normalerweise müssen Sie Datasets nach dem Filtern eines großen Datensatzes neu partitionieren. Ich habe festgestelltrepartition
, dass Spark insgesamt schneller ist, da Spark für Partitionen gleicher Größe ausgelegt ist.NB Ich habe merkwürdigerweise beobachtet, dass eine Neupartitionierung die Größe der Daten auf der Festplatte erhöhen kann . Stellen Sie sicher, dass Sie Tests ausführen, wenn Sie Repartition / Coalesce für große Datenmengen verwenden.
Lesen Sie diesen Blog-Beitrag, wenn Sie noch mehr Details wünschen.
Wenn Sie in der Praxis Coalesce & Repartition verwenden
quelle
rdd.glom().map(len).collect()
aber es gibt viele OOM-Fehler.repartition
Algorithmus Daten für sehr kleine Datensätze nicht so gleichmäßig verteilt. Früher habe ichrepartition
5 Millionen Datensätze in 13 Partitionen organisiert und jede Datei war zwischen 89,3 MB und 89,6 MB groß - das ist ziemlich gleich!Ein weiterer Punkt, der hier zu beachten ist, ist, dass das Grundprinzip von Spark RDD die Unveränderlichkeit ist. Durch die Neupartitionierung oder Zusammenführung wird eine neue RDD erstellt. Das Basis-RDD bleibt mit seiner ursprünglichen Anzahl von Partitionen bestehen. Wenn der Anwendungsfall die Beibehaltung der RDD im Cache erfordert, muss dies auch für die neu erstellte RDD durchgeführt werden.
quelle
repartition
- Es wird empfohlen, es zu verwenden, während die Anzahl der Partitionen erhöht wird, da alle Daten gemischt werden müssen.coalesce
- Es wird empfohlen, es zu verwenden und gleichzeitig die Anzahl der Partitionen zu verringern. Wenn Sie beispielsweise 3 Partitionen haben und diese auf 2 reduzieren möchten,coalesce
werden die Daten der 3. Partition auf Partition 1 und 2 verschoben. Partition 1 und 2 verbleiben im selben Container. Auf der anderen Seiterepartition
werden Daten in allen Partitionen gemischt, daher ist die Netzwerknutzung zwischen den Ausführenden hoch und wirkt sich auf die Leistung aus.coalesce
Leistung besser alsrepartition
beim Reduzieren der Anzahl der Partitionen.quelle
Was aus dem Code und den Codedokumenten folgt,
coalesce(n)
ist, dass es dasselbe ist wiecoalesce(n, shuffle = false)
undrepartition(n)
dasselbe wiecoalesce(n, shuffle = true)
Somit können beide
coalesce
undrepartition
verwendet werden, um die Anzahl der Partitionen zu erhöhenEin weiterer wichtiger Hinweis ist, dass Sie, wenn Sie die Anzahl der Partitionen drastisch verringern, die Verwendung einer gemischten Version von in Betracht ziehen sollten
coalesce
(wierepartition
in diesem Fall). Auf diese Weise können Ihre Berechnungen parallel auf übergeordneten Partitionen ausgeführt werden (mehrere Aufgaben).Bitte beachten Sie auch die entsprechende Antwort hier
quelle
Alle Antworten fügen dieser sehr oft gestellten Frage großes Wissen hinzu.
Nach der Tradition der Zeitachse dieser Frage sind hier meine 2 Cent.
Ich fand, dass die Aufteilung in einem ganz bestimmten Fall schneller als das Zusammenwachsen ist.
Wenn in meiner Anwendung die Anzahl der von uns geschätzten Dateien unter dem bestimmten Schwellenwert liegt, funktioniert die Neupartitionierung schneller.
Hier ist was ich meine
Wenn meine Dateien im obigen Snippet weniger als 20 waren, dauerte es ewig, bis die Koaleszenz abgeschlossen war, während die Neupartitionierung viel schneller war, und daher der obige Code.
Diese Anzahl (20) hängt natürlich von der Anzahl der Arbeitnehmer und der Datenmenge ab.
Hoffentlich hilft das.
quelle
Repartition : Mische die Daten in eine NEUE Anzahl von Partitionen.
Z.B. Der anfängliche Datenrahmen ist in 200 Partitionen unterteilt.
df.repartition(500)
: Die Daten werden von 200 Partitionen auf neue 500 Partitionen gemischt.Zusammenführen : Mischt die Daten in die vorhandene Anzahl von Partitionen.
df.coalesce(5)
: Die Daten werden von den verbleibenden 195 Partitionen auf 5 vorhandene Partitionen gemischt.quelle
Ich möchte der Antwort von Justin und Power Folgendes hinzufügen:
repartition
ignoriert vorhandene Partitionen und erstellt neue. Sie können es also verwenden, um Datenversatz zu beheben. Sie können Partitionsschlüssel erwähnen, um die Verteilung zu definieren. Datenversatz ist eines der größten Probleme im Problembereich "Big Data".coalesce
arbeitet mit vorhandenen Partitionen und mischt eine Teilmenge davon. Es kann den Datenversatz nicht so stark beheben wie es derrepartition
Fall ist. Selbst wenn es weniger teuer ist, ist es möglicherweise nicht das, was Sie brauchen.quelle
Zu all den tollen Antworten möchte ich hinzufügen, dass dies
repartition
eine der besten Optionen ist, um die Vorteile der Datenparallelisierung zu nutzen. Währendcoalesce
bietet eine kostengünstige Option zum Reduzieren der Partitionen und ist sehr nützlich, wenn Sie Daten in HDFS oder eine andere Senke schreiben, um große Schreibvorgänge zu nutzen.Ich habe dies beim Schreiben von Daten im Parkettformat als nützlich empfunden, um den vollen Vorteil zu erzielen.
quelle
Für jemanden, der Probleme beim Generieren einer einzelnen CSV-Datei aus PySpark (AWS EMR) als Ausgabe und beim Speichern auf s3 hatte, half die Verwendung der Neupartition. Der Grund dafür ist, dass das Zusammenwachsen nicht vollständig gemischt werden kann, die Partitionierung jedoch. Im Wesentlichen können Sie die Anzahl der Partitionen mithilfe der Neupartitionierung erhöhen oder verringern, aber nur die Anzahl der Partitionen (jedoch nicht 1) mithilfe der Koaleszenz verringern. Hier ist der Code für alle, die versuchen, eine CSV von AWS EMR nach s3 zu schreiben:
quelle
Auf einfache Weise COALESCE: - dient nur dazu, die Anzahl der Partitionen zu verringern, kein Mischen von Daten, sondern nur die Partitionen zu komprimieren
REPARTITION: - dient sowohl zum Erhöhen als auch zum Verringern der Anzahl der Partitionen, es findet jedoch ein Mischen statt
Beispiel:-
Beides funktioniert gut
Aber wir gehen im Allgemeinen auf diese beiden Dinge ein, wenn wir die Ausgabe in einem Cluster sehen müssen. Wir gehen damit um.
quelle
Sie sollten aber auch sicherstellen, dass die Daten, die zu Koaleszenzknoten kommen, hoch konfiguriert sind, wenn Sie mit großen Datenmengen arbeiten. Da alle Daten auf diese Knoten geladen werden, kann dies zu einer Speicherausnahme führen. Obwohl die Reparatur teuer ist, bevorzuge ich es, sie zu verwenden. Da mischt und verteilt die Daten gleichmäßig.
Seien Sie weise, zwischen Koaleszenz und Partitionierung zu wählen.
quelle
Der
repartition
Algorithmus mischt die Daten vollständig und erstellt gleich große Datenpartitionen.coalesce
kombiniert vorhandene Partitionen, um ein vollständiges Mischen zu vermeiden.Coalesce eignet sich gut zum Erstellen einer RDD mit vielen Partitionen und zum Kombinieren von Partitionen auf einem einzelnen Worker-Knoten, um eine endgültige RDD mit weniger Partitionen zu erstellen.
Repartition
mischt die Daten in Ihrem RDD neu, um die endgültige Anzahl der von Ihnen angeforderten Partitionen zu erstellen. Die Partitionierung von DataFrames scheint ein Implementierungsdetail auf niedriger Ebene zu sein, das vom Framework verwaltet werden sollte, ist es aber nicht. Wenn Sie große DataFrames in kleinere filtern, sollten Sie die Daten fast immer neu partitionieren. Sie werden wahrscheinlich häufig große DataFrames in kleinere filtern. Gewöhnen Sie sich also an die Neupartitionierung.Lesen Sie diesen Blog-Beitrag, wenn Sie noch mehr Details wünschen.
quelle