Ontdek best practices voor Spark performance optimization-IBM Developer

count () op een dataset is een vonk actie. Het is een veel voorkomend probleem dat ik heb gezien waar er meerdere count () calls zijn in Spark applicaties die worden toegevoegd tijdens het debuggen en ze worden niet verwijderd. Het is een goed idee om te zoeken naar Vonk acties en verwijder alle die niet nodig zijn, omdat we niet willen CPU-cycli en andere middelen te gebruiken wanneer niet vereist.

bestandsformaten

wanneer u uw datasets voor uw toepassing ontwerpt, moet u ervoor zorgen dat u optimaal gebruik maakt van de bestandsformaten die beschikbaar zijn met Spark. Sommige dingen om te overwegen:

  • Spark is geoptimaliseerd voor Apache parket en ORC voor leessnelheid. Spark heeft vectorisatie ondersteuning die disk I/O. zuilvormige formaten werken goed.
  • gebruik het parket-bestandsformaat en gebruik compressie.
  • er zijn verschillende bestandsformaten en ingebouwde gegevensbronnen die gebruikt kunnen worden in Apache Spark.Gebruik splittable bestandsformaten.
  • zorg ervoor dat er niet te veel kleine bestanden zijn. Als u veel kleine bestanden hebt, is het misschien zinvol om ze te verdichten voor betere prestaties.

parallellisme

  • Verhoog het aantal Vonk partities om parallellisme te vergroten op basis van de grootte van de gegevens. Zorg ervoor dat clusterbronnen optimaal worden gebruikt. Te weinig partities kunnen ertoe leiden dat sommige uitvoerders inactief zijn, terwijl te veel partities kunnen leiden tot overhead van taakplanning.
  • Stel de partities en taken af. Spark kan taken van 100ms+ en beveelt ten minste 2-3 taken per kern voor een uitvoerder.
  • Spark bepaalt het aantal partities op basis van de invoer van de bestandsgrootte. Soms is het zinvol om het aantal partities expliciet op te geven.
    • de leesapi neemt een optioneel aantal partities.
    • spark.SQL.bestanden.max. partitionbytes, beschikbaar in Spark v2. 0.0, voor parket, ORC, en JSON.
  • de shuffle partities kunnen worden afgesteld door spark in te stellen.SQL.Shuffle.partities, die standaard 200 is. Dit is echt klein als je grote datasets hebt.

Shuffle verminderen

Shuffle is een dure operatie omdat het gaat om het verplaatsen van gegevens over de knooppunten in uw cluster, waarbij netwerk en schijf I/O. Het is altijd een goed idee om de hoeveelheid gegevens te verminderen die moet worden geschud. Hier zijn enkele tips om shuffle te verminderen:

  • Stel de vonk af.SQL.Shuffle.partities.
  • Partitioneer de invoerdataset op de juiste wijze, zodat elke taakgrootte niet te groot is.
  • gebruik de Spark UI om het plan te bestuderen om te zoeken naar mogelijkheden om de shuffle zoveel mogelijk te verminderen.
  • aanbevolen formule voor spark.SQL.Shuffle.partities:
    • voor grote datasets, streven naar overal van 100MB tot minder dan 200MB taakdoelgrootte voor een partitie (gebruik doelgrootte van 100MB, bijvoorbeeld).
    • spark.SQL.Shuffle.partities = quotiënt (shuffle Stadium input size / target size) / totale kernen) * totale kernen.

Filter / verminder de datasetgrootte

zoek naar mogelijkheden om gegevens zo vroeg mogelijk in uw toepassingspijplijn uit te filteren. Als er een filterbewerking is en u alleen geïnteresseerd bent in het uitvoeren van analyses voor een subset van de gegevens, moet u dit filter vroeg toepassen. Als u de grootte van de dataset vroeg kunt verkleinen, Doe het dan. Gebruik de juiste filter predicaten in uw SQL query, zodat Spark ze kan duwen naar de onderliggende datasource; selectieve predicaten zijn goed. Gebruik ze waar nodig. Gebruik partitiefilters als ze van toepassing zijn.

cache

Spark ondersteunt het cachen van datasets in het geheugen. Er zijn verschillende opties beschikbaar:

  • gebruik caching wanneer dezelfde bewerking meerdere keren wordt berekend in de pijpleidingsstroom.
  • gebruik caching met behulp van de persist API om de vereiste cache-instelling in te schakelen (persist to disk or not; serialized or not).
  • wees u bewust van lazy loading en prime cache indien nodig vooraf. Sommige API ‘ s staan te popelen en sommige niet.
  • Bekijk het Opslagtabblad van de Spark UI voor informatie over de datasets die u in de cache hebt opgeslagen.
  • het is een goede gewoonte om uw dataset in de cache te deactiveren wanneer u klaar bent met het gebruik ervan om bronnen vrij te geven, vooral wanneer u andere mensen het cluster ook gebruikt.

Join

Join is in het algemeen een dure operatie, dus let op de joins in uw applicatie om ze te optimaliseren. BroadcastHashJoin presteert het meest voor gevallen waarin een van de relaties klein genoeg is om het uit te zenden. Hieronder zijn enkele tips:

  • Join order matters; begin met de meest selectieve join. Voor relaties kleiner dan vonk.SQL.autoBroadcastJoinThreshold, kunt u controleren of broadcast HashJoin wordt opgepikt.
  • gebruik SQL-hints indien nodig om een specifiek type join te forceren.
    • voorbeeld: wanneer een kleine dataset wordt samengevoegd met een grote dataset, kan een broadcast-join worden gedwongen de kleine dataset uit te zenden.
    • bevestig dat Spark broadcast hash join opneemt; zo niet, dan kan men het forceren met behulp van de SQL hint.
  • vermijd cross-joins.
  • Broadcast HashJoin is het meest performant, maar kan niet van toepassing zijn als beide relaties in join groot zijn.
  • Verzamel statistieken over tabellen voor Spark om een optimaal plan te berekenen.

afstellen clusterbronnen

  • afstellen van de bronnen op het cluster afhankelijk van de resource manager en versie van Spark.
  • Stel het beschikbare geheugen af op de driver: spark.stuurprogramma.geheugen.
  • Stel het aantal uitvoerders en het geheugen – en kerngebruik af op basis van bronnen in het cluster: uitvoerdergeheugen, num-uitvoerders en uitvoerderkernen.

bekijk de configuratie documentatie voor de Spark release waarmee u werkt en gebruik de juiste parameters.

vermijd dure operaties

  • vermijd volgorde met indien dit niet nodig is.
  • wanneer u uw query ‘ s aan het schrijven bent, kunt u in plaats van met select * alle kolommen ophalen, alleen de kolommen ophalen die relevant zijn voor uw query.
  • bel niet onnodig.

scheefgetrokken gegevens

  • zorg ervoor dat de partities gelijk zijn in grootte om scheefgetrokken gegevens en lage problemen met CPU-gebruik te voorkomen.
    • als voorbeeld: als er gegevens uit een JDBC-gegevensbron parallel binnenkomen, en elk van deze partities niet een gelijk aantal records opvraagt, zal dit resulteren in taken van ongelijke grootte (een vorm van gegevens scheeftrekken). Misschien is de ene partitie maar een paar KB, terwijl de andere een paar honderd MB is. Sommige taken zullen groter zijn dan andere, en terwijl de uitvoerders op grotere taken druk zullen zijn, zullen de andere uitvoerders, die de kleinere taak behandelen, eindigen en inactief zijn.
    • Als gegevens bij de bron niet optimaal gepartitioneerd zijn, kunt u ook de afwegingen evalueren van het gebruik van repartitie om een gebalanceerde partitie te krijgen en vervolgens caching gebruiken om deze in het geheugen te behouden indien van toepassing.
  • repartitie zal leiden tot een shuffle, en shuffle is een dure operatie, dus dit moet worden geëvalueerd op basis van een toepassing.
  • gebruik de Spark UI om te zoeken naar de partitiegroottes en de duur van de taak.

UDFs

Spark heeft een aantal ingebouwde User-defined functions (UDFs) beschikbaar. Voor prestaties, controleren om te zien of u een van de ingebouwde functies kunt gebruiken, omdat ze goed zijn voor de prestaties. Aangepaste UDFs in de Scala API zijn beter presteren dan Python UDFs. Als je de Python API moet gebruiken, gebruik dan de nieuw geà ntroduceerde panda ‘ s UDF in Python die werd uitgebracht in Spark 2.3. De panda ‘ s UDF (vectorized UDFs) ondersteuning in Spark heeft aanzienlijke prestatieverbeteringen in tegenstelling tot het schrijven van een aangepaste Python UDF. Meer informatie over het schrijven van een panda UDF.

ik hoop dat dit nuttig was voor u bij het schrijven van uw Spark applicaties. Goede ontwikkeling! In een aankomende blog zal ik laten zien hoe je het uitvoeringsplan voor je vonk baan te krijgen.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.