Partitionering in Spark ontrafelen



Deze blog vertelt je alles wat je moet weten over partitioneren in Spark, partitietypen en hoe het de uitvoeringssnelheid voor sleutelgebaseerde transformaties verbetert.

Bijgedragen door Prithviraj Bose

Spark's Veerkrachtige gedistribueerde datasets (de programmeer-abstractie) worden lui geëvalueerd en de transformaties worden opgeslagen als gerichte acyclische grafieken (DAG). Dus elke actie op de RDD zorgt ervoor dat Spark de DAG opnieuw berekent. Dit is hoe de veerkracht wordt bereikt in Spark, want als een werkknooppunt uitvalt, hoeft de DAG alleen opnieuw te worden berekend.





hoe typecast in java

Het is ook verplicht om te cachen (aanhouden met het juiste opslagniveau) de RDD zodanig dat frequente acties op de RDD Spark niet dwingen de DAG opnieuw te berekenen.Onderwerpen die in deze blog worden behandeld, zijn in wezen vereist voor Apache Spark- en Scala-certificering. Onderwerpen die in deze blog worden behandeld, zijn in wezen vereist voor .

Waarom een ​​partitioner gebruiken?

Bij clustercomputing is de centrale uitdaging het netwerkverkeer tot een minimum te beperken. Wanneer de gegevens sleutel / waarde-georiënteerd zijn, wordt partitionering noodzakelijk omdat er voor volgende transformaties op de RDD een behoorlijke hoeveelheid gegevens over het netwerk wordt geschud. Als vergelijkbare sleutels of een reeks sleutels in dezelfde partitie zijn opgeslagen, wordt het schudden tot een minimum beperkt en wordt de verwerking aanzienlijk snel.



Transformaties die het herverdelen van gegevens tussen werkknooppunten vereisen, hebben veel baat bij partitionering. Dergelijke transformaties zijn cogroup, groupWith, join, leftOuterJoin, rightOuterJoin, groupByKey, reduceByKey, combinerenByKey en opzoeken .

Partities kunnen worden geconfigureerd, mits de RDD op sleutelwaarden is gebaseerd.

Eigenschappen van partitie

  1. Tuples in dezelfde partitie bevinden zich gegarandeerd op dezelfde machine.
  2. Elk knooppunt in een cluster kan meer dan één partitie bevatten.
  3. Het totale aantal partities is configureerbaar, standaard is het ingesteld op het totale aantal cores op alle uitvoerknooppunten.

Typen partitionering in Spark

Spark ondersteunt twee soorten partitionering,

  • Hash-partitionering : Gebruikt Java's Object.hashCode methode om de partitie te bepalen als partitie = key.hashCode ()% numPartitions.

hash-partitioning-demystifying-partitioning-in-spark



  • Bereik partitionering : Gebruikt een bereik om de sleutels die binnen een bereik vallen naar de respectievelijke partities te distribueren. Deze methode is geschikt als de toetsen een natuurlijke volgorde hebben en de toetsen niet negatief zijn. Het onderstaande codefragment toont het gebruik van range partitioner.

Code Voorbeeld

Laten we eens kijken naar een voorbeeld van het verdelen van gegevens over werkknooppunten. De volledige Scala-code is beschikbaar hier .

Hier zijn enkele testgegevens van 12 coördinaten (als tupels),

Creëer een org.apache.spark.HashPartitioner van grootte 2, waar de sleutels over deze twee partities worden verdeeld op basis van de hash-code van de sleutels.

Vervolgens kunnen we de paren inspecteren en verschillende sleutelgebaseerde transformaties uitvoeren, zoals foldByKey en reduceByKey.

Samenvattend: partitionering verbetert de uitvoeringssnelheid van op sleutels gebaseerde transformaties aanzienlijk.

Heeft u een vraag voor ons? Vermeld het in het opmerkingengedeelte en we nemen contact met u op.

Gerelateerde berichten:

Waarom je Spark moet leren nadat je Hadoop onder de knie hebt

lengte van array in javascript

Apache Spark versus Hadoop MapReduce