2016-09-18 1 views
2

Betrachten Sie, ich habe eine PairedRDD von, sagen wir 10 Partitionen. Aber die Tasten sind nicht gleichmäßig verteilt, das heißt, alle 9 Partitionen mit Daten zu einem einzigen Schlüssel gehört sagen a und der Rest der Tasten sagen b,c gibt es in den letzten Partition only.This wird durch die Abbildung unten dargestellt: enter image description hereSpeichert Funke alle Elemente einer RDD [K, V] für einen bestimmten Schlüssel in einer einzelnen Partition nach "groupByKey", auch wenn die Daten für einen Schlüssel sehr groß sind?

Nun, wenn ich eine groupByKey auf dieser rdd mache, von meinem Verständnis alle Daten für den gleichen Schlüssel werden schließlich zu verschiedenen Partitionen gehen oder keine Daten für den gleichen Schlüssel wird nicht in mehreren Partitionen sein. Bitte korrigieren Sie mich, wenn ich falsch liege.

Wenn das der Fall ist, kann es eine Chance geben, dass die Partition für Schlüssel a von Größe sein kann, die nicht in einem RAM des Arbeiters passen kann. In welchem ​​Fall wird der Funke funktionieren? Meine Annahme ist so, als würden die Daten auf die Festplatte des Arbeiters gelangen. Ist das richtig? Oder wie Funkengriff solche Situationen

Antwort

3

Does Funken halten alle Elemente (...) für einen bestimmten Schlüssel in einer einzigen Partition nach groupByKey

Ja, es tut. Das ist ein wesentlicher Punkt des Shuffle.

Die Partition für Schlüssel a kann von der Größe sein, die nicht in den Arbeitsspeicher eines Arbeiters passt. In diesem Fall wird der Funke

Größe einer bestimmten Partition ist nicht das größte Problem hier. Partitionen werden unter Verwendung von Lazy Iterators dargestellt und können problemlos Daten speichern, die den verfügbaren Speicher übersteigt. Das Hauptproblem ist eine nicht-faule lokale Datenstruktur, die beim Gruppieren erzeugt wird.

Alle Werte für den bestimmten Schlüssel werden im Speicher als CompactBuffer gespeichert, sodass eine einzelne große Gruppe zu OOM führen kann. Selbst wenn jeder Datensatz separat in den Speicher passt, können Sie dennoch schwerwiegende GC-Probleme feststellen.

Allgemein gilt:

  • Es ist sicher, wenn auch nicht die optimale Leistung klug, um Daten neu partitionieren, wo Menge von einer Partition zugeordnet Datenmenge des verfügbaren Speichers überschreitet.
  • Es ist nicht sicher, PairRDDFunctions.groupByKey in der gleichen Situation zu verwenden.

Hinweis: Sie sollten diese allerdings auf verschiedene Implementierungen von groupByKey nicht extrapolieren. Insbesondere verwenden sowohl Spark Dataset als auch PySparkRDD.groupByKey komplexere Mechanismen.

+0

Ich aktualisierte die Antwort. Sie können auch https://github.com/awesome-spark/spark-gotchas/blob/master/04_rdd_actions_and_transformations_by_example.md#be-smart-about-groupbykey (Disclaimer: Ich bin Co-Autor) überprüfen. – zero323

+0

okay. Irgendwelche nützlichen Links haben Sie darüber –

+0

Eine Sache noch: Erstens werden ganze Daten für einen bestimmten Schlüssel zu einer einzelnen Partition in einem einzelnen Worker-Knoten gelangen, dann wird als zweiter Schritt lokale Gruppierung zur Bildung von RDD [k, Iterable (v) ]. Recht?gibt es eine Chance, es im ersten Schritt aufgrund unzureichender lokaler Speicher fehlzuschlagen –

Verwandte Themen