8 Prestandaoptimeringstekniker med Spark

Antag att du har en situation där en datamängd är mycket liten och en annan datamängd är ganska stor, och du vill utföra kopplingsoperationen mellan dessa två. I så fall bör vi gå till sändningsanslutningen så att den lilla datamängden kan passa in i din sändningsvariabel. Syntaxen för att använda sändningsvariabeln är df1.gå med(sändning (df2)). Här har vi en andra dataframe som är väldigt liten och vi håller denna dataram som en sändningsvariabel.

kod:

val broadcastVar = sc.sändning (Array(1, 2, 3))

broadcastVar.värde

res0: Array = Array(1, 2, 3)

val accum = sc.longAccumulator (”min ackumulator”)

sc.parallellisera (Array(1, 2, 3, 4)).foreach (x = > accum.Lägg till (x))

accum.värde

res2: Long = 10

Cache och kvarstår

  • Spark ger sina egna cachningsmekanismer som kvarstår() och cache().
  • cache() och persist() lagrar datauppsättningen i minnet.
  • när du har en liten dataset som behöver användas flera gånger i ditt program, cachar vi det dataset.
  • Cache() – alltid i minnet
  • kvarstår() – minne och diskar

Spark ger sin egen cachningsmekanism som kvarstår och cachning. Kvarstår och Cache mekanismer kommer att lagra datauppsättningen i minnet när det finns krav, där du har en liten datamängd och att datamängden används flera gånger i ditt program. Om vi tillämpar RDD.Cache () Det kommer alltid att lagra data i minnet, och om vi tillämpar RDD.Kvarstår () då kan en del av data lagras i minnet, vissa kan lagras på disken.

5. ByKey Operation

  • Shuffles är tunga operationer som förbrukar mycket minne.
  • vid kodning i Spark ska användaren alltid försöka undvika att blanda.
  • hög blandning kan ge upphov till ett OutOfMemory-fel; för att undvika ett sådant fel kan användaren öka parallellitetsnivån.
  • använd reduceByKey istället för groupByKey.
  • partitionera data korrekt.

som vi vet under vår omvandling av Spark har vi många ByKey-operationer. ByKey operationer generera mycket shuffle. Shuffles är tung drift eftersom de förbrukar mycket minne. När du kodar i Spark bör en användare alltid försöka undvika shuffle-funktion eftersom shuffle-funktionen försämrar prestandan. Om det finns hög blandning kan en användare få felet ur minnet. I detta fall, för att undvika det felet, bör en användare öka parallellitetsnivån. Istället för groupBy bör en användare gå till reduceByKey eftersom groupByKey skapar mycket blandning som hindrar prestanda, medan reduceByKey inte blandar data lika mycket. Därför är reduceByKey snabbare jämfört med groupByKey. När någon ByKey-operation används ska användaren partitionera data korrekt.

6. Filformat val

  • Spark stöder många format, såsom CSV, JSON, XML, parkett, ORC, AVRO, etc.
  • Spark jobb kan optimeras genom att välja parkett fil med snappy komprimering som ger hög prestanda och bästa analys.
  • Parquet-filen är inbyggd i Spark som bär metadata tillsammans med dess sidfot.

Spark kommer med många filformat som CSV, JSON, XML, parkett, ORC, Avro och mer. Ett Gnistjobb kan optimeras genom att välja parkettfilen med snygg komprimering. Parquet-filen är inbyggd i Spark som bär metadata tillsammans med sidfoten, eftersom vi vet att parquet-filen är inbyggd i spark som är i binärt format och tillsammans med de data som den också bär sidfoten bär den också metadata och dess sidfot så när du skapar någon parquet-fil ser du .metadatafil i samma katalog tillsammans med datafilen.

kod:

val peopleDF = gnista.läsa.json (”exempel/src/huvudsaklig/resurser/människor.json”)

peopleDF.skriva.parkett (”människor.parkett”)

val parquetFileDF = gnista.läsa.parkett (”människor.parkett”)

val usersDF = gnista.läsa.format(”avro”).ladda (”exempel/src/main/resurser/användare.avro”)

usersDF.välj (”namn”, ”favorite_color”).skriva.format(”avro”).spara (”namesAndFavColors.Avro”)

sophämtning Tuning

  • JVM sophämtning kan vara ett problem när du har stor samling av oanvända föremål.
  • det första steget i gc tuning är att samla in statistik genom att välja – verbose när du skickar spark jobb.
  • i en idealisk situation försöker vi hålla GC-omkostnader < 10% av heapminnet.

som vi vet under vårt Spark-jobb körs på JVM-plattformen så JVM garbage collection kan vara problematiskt när du har en stor samling av ett oanvänt objekt så det första steget i tuning av garbage collection är att samla statik genom att välja alternativet i din Spark submit verbose. I allmänhet bör vi i en idealisk situation hålla vårt skräpsamlingsminne mindre än 10% av heapminnet.

8. Nivå av parallellitet

  • parallellitet spelar en mycket viktig roll när du stämmer gnistjobb.
  • varje partition ~ – uppgift kräver en enda kärna för bearbetning.
  • det finns två sätt att upprätthålla parallellitet:
    • partitionering: ger lika många partitioner med hög blanda
    • Coalesce: generellt minskar antalet partitioner med mindre blanda.

i alla distribuerade miljöer spelar parallellism en mycket viktig roll när du ställer in ditt Gnistjobb. När ett Spark-jobb skickas skapar det skrivbordet som kommer att innehålla steg, och uppgifterna beror på partition så varje partition eller uppgift kräver en enda kärna i systemet för bearbetning. Det finns två sätt att upprätthålla parallelliteten – omfördelning och sammanslagning. När du tillämpar Ompartitionsmetoden ger det dig lika många partitioner men det kommer att blanda mycket så det är inte tillrådligt att gå till Ompartition när du vill lash Alla data. Coalesce kommer i allmänhet att minska antalet partitioner och skapar mindre blandning av data.

dessa faktorer för gnistoptimering, om de används korrekt, kan –



+