Partitionierung in Spark entmystifizieren



In diesem Blog erfahren Sie alles, was Sie über die Partitionierung in Spark, Partitionstypen und die Verbesserung der Ausführungsgeschwindigkeit für schlüsselbasierte Transformationen wissen müssen.

Beitrag von Prithviraj Bose

Spark's Ausfallsichere verteilte Datensätze (die Programmierabstraktion) werden träge ausgewertet und die Transformationen als gerichtete azyklische Graphen (DAG) gespeichert. Bei jeder Aktion auf dem RDD berechnet Spark die DAG neu. Auf diese Weise wird die Ausfallsicherheit in Spark erreicht, denn wenn ein Arbeitsknoten ausfällt, muss die DAG nur neu berechnet werden.





Es ist auch obligatorisch zum Zwischenspeichern (Behalten Sie die entsprechende Speicherebene bei) die RDD, sodass häufige Aktionen auf der RDD Spark nicht zwingen, die DAG neu zu berechnen.Die in diesem Blog behandelten Themen sind im Wesentlichen für die Apache Spark- und Scala-Zertifizierung erforderlich. Themen, die in diesem Blog behandelt werden, sind im Wesentlichen erforderlich für .

Warum einen Partitionierer verwenden?

Beim Cluster-Computing besteht die zentrale Herausforderung darin, den Netzwerkverkehr zu minimieren. Wenn die Daten auf Schlüsselwerte ausgerichtet sind, ist eine Partitionierung unerlässlich, da für nachfolgende Transformationen auf dem RDD eine angemessene Menge an Daten im gesamten Netzwerk gemischt wird. Wenn ähnliche Schlüssel oder Schlüsselbereiche in derselben Partition gespeichert sind, wird das Mischen minimiert und die Verarbeitung wird wesentlich schneller.



Transformationen, bei denen Daten über Arbeitsknoten hinweg gemischt werden müssen, profitieren stark von der Partitionierung. Solche Transformationen sind cogroup, groupWith, join, leftOuterJoin, rightOuterJoin, groupByKey, reductByKey, combinByKey und Nachschlagen .

Partitionen sind konfigurierbar, sofern die RDD auf Schlüsselwerten basiert.

Eigenschaften der Partition

  1. Tupel in derselben Partition befinden sich garantiert auf demselben Computer.
  2. Jeder Knoten in einem Cluster kann mehr als eine Partition enthalten.
  3. Die Gesamtzahl der Partitionen ist konfigurierbar. Standardmäßig ist sie auf die Gesamtzahl der Kerne auf allen Executor-Knoten eingestellt.

Arten der Partitionierung in Spark

Spark unterstützt zwei Arten der Partitionierung:

  • Hash-Partitionierung : Verwendet Java Object.hashCode Methode zur Bestimmung der Partition als partition = key.hashCode ()% numPartitions.

hash-partitioning-demystifying-partitioning-in-spark



  • Bereichspartitionierung : Verwendet einen Bereich, um die Schlüssel, die in einen Bereich fallen, auf die jeweiligen Partitionen zu verteilen. Diese Methode eignet sich, wenn die Schlüssel eine natürliche Reihenfolge aufweisen und die Schlüssel nicht negativ sind. Das folgende Codefragment zeigt die Verwendung des Bereichspartitionierers.

Codebeispiel

Sehen wir uns ein Beispiel zum Partitionieren von Daten auf Arbeitsknoten an. Der vollständige Scala-Code ist verfügbar Hier .

Hier sind einige Testdaten von 12 Koordinaten (als Tupel):

Erstelle ein org.apache.spark.HashPartitioner von Größe 2, wobei die Schlüssel basierend auf dem Hash-Code der Schlüssel auf diese beiden Partitionen aufgeteilt werden.

Dann können wir die Paare untersuchen und verschiedene schlüsselbasierte Transformationen durchführen, wie z foldByKey und reduByKey.

Zusammenfassend lässt sich sagen, dass die Partitionierung die Ausführungsgeschwindigkeit für schlüsselbasierte Transformationen erheblich verbessert.

Hast du eine Frage an uns? Bitte erwähnen Sie es in den Kommentaren und wir werden uns bei Ihnen melden.

Zusammenhängende Posts:

c ++ Nummern in aufsteigender Reihenfolge sortieren

Warum Sie Spark lernen sollten, nachdem Sie Hadoop gemeistert haben

Apache Spark gegen Hadoop MapReduce