Apache Spark optimization Techniques and Performance Tuning

de Chandan Gaur|Big Data Engineering|05,Oct,2020

ce este Apache Spark?

Apache, în 2012, a descris fundația resilient Distributed Dataset (RDD în Apache Spark) cu seturi de date distribuite numai în citire pe clustere distribuite și a numit-o Apache Spark. Mai târziu, introduc API-ul Dataset și apoi API-urile Dataframe pentru streaming lot și structurat de date. Acest articol enumeră cele mai bune tehnici de optimizare Apache Spark.

Apache Spark este o platformă rapidă de calcul cluster dezvoltată pentru efectuarea mai multor calcule și procesarea fluxurilor. Spark poate gestiona o mare varietate de sarcini de lucru în comparație cu sistemele tradiționale care necesită mai multe sisteme pentru a rula și a sprijini. Conducte de analiză a datelor sunt facilitate de scânteie în combinație de diferite tipuri de prelucrare, care este necesar pentru producție. Apache Spark este creat pentru a funcționa cu un manager de cluster extern, cum ar fi fire sau managerul său autonom.

caracteristici ale Apache Spark

Unele caracteristici ale Apache Spark includ:-

  • platformă unificată pentru scrierea aplicațiilor de date mari.
  • ușurința de dezvoltare.
  • proiectat pentru a fi foarte accesibil.
  • Spark poate rula independent. Astfel, oferă flexibilitate.
  • Cost Eficient.

XenonStack oferă servicii și soluții de analiză pentru ingerarea, prelucrarea și analizarea datelor în timp real și a fluxurilor de date rapid și eficient pentru Internetul obiectelor, monitorizare, întreținere preventivă și predictivă.

din articol, Streaming și servicii de analiză în timp real

înțelegerea modului în care funcționează optimizarea Apache Spark?

pentru a înțelege cum funcționează optimizarea Apache Spark, trebuie să înțelegeți mai întâi arhitectura sa și în secțiunea ulterioară, vom elabora același lucru.

arhitectura Apache Spark

arhitectura Run-time a Spark este format din trei părți –

Spark Driver (Master Process)

driverul Spark convertește programele în sarcini și programa sarcinile pentru executori. Planificatorul de sarcini face parte din Driver și ajută la distribuirea sarcinilor Executorilor.

Spark Cluster Manager

un manager de cluster este nucleul din Spark care permite lansarea Executorilor și, uneori, driverele pot fi lansate și de acesta. Spark Scheduler programează acțiunile și locurile de muncă în aplicarea Spark în mod FIFO pe cluster manager în sine. De asemenea, ar trebui să citiți despre Apache Airflow.

executorii (procese Slave)

executorii sunt entitățile individuale pe care se execută sarcina individuală a jobului. Executorii vor rula întotdeauna până la ciclul de viață al unei aplicații spark odată ce sunt lansate. Executorii eșuați nu opresc executarea spark job.

RDD (Resilient Distributed Datasets)

un RDD este o colecție distribuită de seturi de date imuabile pe nodurile distribuite ale clusterului. Un RDD este partiționat într-una sau mai multe partiții. RDD este nucleul spark ca distribuție între diferitele noduri ale clusterului care utilizează localitatea datelor. Pentru a realiza paralelismul în interiorul aplicației, partițiile sunt unitățile pentru aceasta. Repartiția sau coalescența transformărilor pot ajuta la menținerea numărului de partiții. Accesul la date este optimizat folosind RDD amestecare. Deoarece Spark este aproape de date, trimite date prin diferite noduri și creează partiții necesare după cum este necesar.

DAG (Grafic aciclic direcționat)

Spark tinde să genereze un grafic operator atunci când introducem codul nostru la consola Spark. Atunci când o acțiune este declanșată pentru a declanșa RDD, Spark susține că graficul la DAGScheduler. Apoi împarte aceste grafice operator la etapele sarcinii în interiorul DAGScheduler. Fiecare pas poate conține lucrări bazate pe mai multe partiții ale datelor primite. DAGScheduler conducte aceste grafice individuale ale operatorului împreună. De exemplu, graficele operatorului de hartă programează pentru o singură etapă și aceste etape trec la. Task Scheduler în cluster manager pentru executarea lor. Aceasta este sarcina muncii sau a Executorilor de a executa aceste sarcini pe sclav.

procesare distribuită folosind partiții eficient

creșterea numărului de executori pe clustere crește, de asemenea, paralelismul în procesarea Spark Job. Dar pentru aceasta, trebuie să avem informații adecvate despre modul în care aceste date ar fi distribuite între acei executori prin partiționare. RDD este util pentru acest caz, cu trafic neglijabil pentru amestecarea datelor între acești executori. Se poate personaliza partiționarea pentru RDD pereche (RDD cu perechi cheie-valoare). Spark asigură că set de chei va apărea întotdeauna împreună în același nod, deoarece nu există nici un control explicit în acest caz.

Apache Spark Security ajută la autentificarea printr-un secret partajat. Autentificarea prin scânteie este parametrul de configurare prin care poate fi configurată autentificarea. Este parametrul care verifică dacă protocoalele de comunicare spark fac autentificare folosind un secret partajat sau nu.

din articol, Apache Spark Security

greșeli de evitat în timp ce scrieți Aplicații Spark

reduceByKey sau groupByKey

atât groupByKey, cât și reduceByKey produc același răspuns, dar conceptul de a produce rezultate este diferit. reduceByKey este cel mai potrivit pentru setul de date mare, deoarece în Spark combină ieșirea cu o cheie partajată pentru fiecare partiție înainte de amestecarea datelor. În timp ce pe de altă parte, groupByKey amestecă toate perechile cheie-valoare. GroupByKey provoacă shuffles inutile și transferul de date prin rețea.

mențineți dimensiunea necesară a blocurilor de amestecare

implicit, blocul de amestecare Spark nu poate depăși 2 GB. O mai bună utilizare este de a crește partiții și de a reduce capacitatea sa de a ~128MB pe partiție, care va reduce dimensiunea blocului shuffle. Putem folosi repartiția sau coalescența în aplicații obișnuite. Partițiile mari fac procesul lent din cauza unei limite de 2 GB, iar puține partiții nu permit scalarea lucrării și realizarea paralelismului.

formate de fișiere și delimitatori

Alegerea formatelor de fișiere potrivite pentru fiecare specificație legată de date este o durere de cap. Trebuie să alegeți cu înțelepciune formatul de date pentru tipurile de ingestie, Tipul intermediar și tipul de ieșire Final. De asemenea, putem clasifica formatele de fișiere de date pentru fiecare tip în mai multe moduri, cum ar fi putem folosi formatul de fișier AVRO pentru stocarea datelor Media, deoarece Avro este cel mai bine optimizat pentru date binare decât parchetul. Parchetul poate fi utilizat pentru stocarea informațiilor despre metadate, deoarece este foarte comprimat.

fișiere de date mici

difuzarea este o tehnică de încărcare a fișierelor de date mici sau a seturilor de date în blocuri de memorie, astfel încât acestea să poată fi unite cu seturi de date mai masive, cu mai puține cheltuieli generale de amestecare a datelor. De exemplu, putem stoca fișiere de date mici în n număr de blocuri și fișiere de date mari pot fi unite la aceste blocuri de date în viitor, deoarece fișierele de date mari pot fi distribuite între aceste blocuri într-un mod paralel.

nicio monitorizare a etapelor de lucru

DAG este o structură de date utilizată în Spark care descrie diferite etape ale sarcinilor în format grafic. Majoritatea dezvoltatorilor scriu și execută codul, dar monitorizarea sarcinilor de muncă este esențială. Această monitorizare se realizează cel mai bine prin gestionarea DAG și reducerea etapelor. Lucrarea cu 20 de trepte este prelungită în comparație cu o lucrare cu 3-4 etape.

ByKey, repartiție sau orice alte operațiuni care declanșează shuffles

Cele mai multe ori avem nevoie pentru a evita shuffles la fel de mult ca putem ca date shuffles peste multe, și, uneori, devine foarte complex pentru a obține scalabilitate din aceste shuffles. GroupByKey poate fi un bun valoros, dar nevoia sa trebuie descrisă mai întâi.

învățarea prin întărire

învățarea prin întărire nu este doar conceptul de a obține un mediu mai bun de învățare automată, ci și de a procesa deciziile într-un mod mai bun. Trebuie să aplicăm învățarea de întărire profundă în spark dacă modelul de tranziție și modelul de recompensă sunt construite corect pe seturi de date și, de asemenea, agenții sunt suficient de capabili să estimeze rezultatele.

Apache Spark optimizare factori și tehnici

una dintre cele mai bune caracteristici ale Apache Spark optimizare este că ajută pentru calcule de date în memorie. Blocajul pentru aceste calcule de optimizare spark poate fi CPU, memorie sau orice resursă din cluster. Necesitatea serializării datelor, reducerea memoriei poate apărea în astfel de cazuri. Acești factori pentru optimizarea scânteii, dacă sunt utilizați corect, pot–

  • eliminarea procesului de lucru pe termen lung
  • motor de execuție corecție
  • îmbunătățește timpul de performanță prin gestionarea resurselor

13 tehnici Simple pentru Apache Spark Optimization

acumulatorii sunt variabile globale pentru executori care pot fi adăugate numai printr-o operație asociativă și comutativă. Prin urmare, poate fi eficient în paralel. Acumulatorii pot fi utilizați pentru a implementa contoare (la fel ca în reducerea hărții) sau o altă sarcină, cum ar fi urmărirea apelurilor API.

în mod implicit, Spark acceptă acumulatori numerici, dar programatorii au avantajul de a adăuga suport pentru noi tipuri. Spark asigură că actualizarea fiecărei sarcini va fi aplicată o singură dată variabilelor acumulatorului. În timpul transformărilor, utilizatorii ar trebui să aibă o conștientizare a actualizării fiecărei sarcini, deoarece acestea pot fi aplicate de mai multe ori dacă etapele jobului sunt re-executate.

Hive Bucketing Performance

Bucketing rezultă cu un număr fix de fișiere pe măsură ce specificăm numărul de găleți cu o găleată. Hive a luat câmpul, se calculează hash și atribuie o înregistrare la acea găleată special. Bucketing-ul este mai stabil atunci când câmpul are cardinalitate ridicată, procesare mare de date, iar înregistrările sunt distribuite uniform între toate gălețile, în timp ce partiționarea funcționează atunci când cardinalitatea câmpului de partiționare este scăzută.

Bucketing reduce cheltuielile generale ale fișierelor de sortare. De exemplu, dacă ne unim două tabele care au un număr egal de găleți în ea, spark se alătură datele direct ca chei deja sortate găleți. Numărul de fișiere bucket poate fi calculat ca mai multe partiții în mai multe găleți.

optimizare predicat Pushdown

predicatul pushdown este o tehnică de procesare numai a datelor necesare. Predicatele pot fi aplicate la SparkSQL prin definirea filtrelor în condițiile în care. Folosind comanda explicați pentru interogare putem verifica etapele de procesare a interogării. Dacă planul de interogare conține PushedFilter decât interogarea este optimizat pentru a selecta numai datele necesare ca fiecare predicat returnează fie adevărat sau fals.

dacă nu există nici un PushedFilter găsit în planul de interogare decât mai bine este de a arunca în cazul în care condiția. Predicate pushdowns limitează numărul de fișiere și partiții care SparkSQL citește în timp ce interogarea, reducând astfel disc I/O începe în memorie Analytics. Interogarea datelor în găleți cu împingeri predicate produce rezultate mai rapide cu mai puțină amestecare.

serializarea/deserializarea Zero a Datelor folosind Apache Arrow

Apache Arrow este utilizat ca format de rulare în memorie pentru motoarele de interogare analitice. Arrow oferă serializarea datelor / deserializare zero shuffles prin memorie partajată. Arrow flight trimite seturi de date mari prin rețea. Arrow are formatul de fișier săgeată, care permite zero-copie acces aleatoriu la datele de pe discuri. Arrow are un strat standard de acces la date pentru toate aplicațiile spark.

reduce cheltuielile generale pentru operațiunile SerDe pentru amestecarea datelor, deoarece are un loc comun în care se află toate datele și în format specific săgeții.

reglarea colectării gunoiului utilizarea colecției G1GC

când reglați colectoarele de gunoi, vă recomandăm mai întâi să utilizați G1 GC pentru a rula aplicații Spark. Colectorul de gunoi G1 se ocupă în întregime de grămezi în creștere, care sunt frecvent observate cu scânteie. Cu G1, vor fi necesare mai puține opțiuni pentru a oferi atât un randament mai mare, cât și o latență mai mică. Pentru a controla caracteristicile și comportamentele imprevizibile ale diferitelor aplicații, GC tuning trebuie să fie stăpânit în funcție de jurnalele generate.

înainte de aceasta, trebuie aplicate alte tehnici de optimizare, cum ar fi Streaming și soluții de analiză în timp real, în logica și codul programului. De cele mai multe ori, G1GC ajută la optimizarea timpului de pauză între procesele care sunt destul de des în aplicațiile Spark, reducând astfel timpul de execuție a lucrărilor cu un sistem mai fiabil.

gestionarea și reglarea memoriei

după cum știm că, pentru calcule precum amestecarea, sortarea și așa mai departe, se folosește memoria de execuție, în timp ce în scopuri de cache se folosește memoria de stocare care propagă și datele interne. S-ar putea să existe unele cazuri în care lucrările nu utilizează niciun cache; prin urmare, cazuri de eroare în afara spațiului în timpul execuției. Locurile de muncă din cache aplică întotdeauna mai puțin spațiu de stocare în cazul în care datele nu sunt permise să fie evacuate de nicio cerință de execuție. În plus, aplicația de Streaming în timp real cu Apache Spark se poate face.

putem seta spark.memorie.fracție pentru a determina cât de mult spațiu heap JVM este utilizat pentru memoria de execuție Spark. În mod obișnuit, 60% este implicit. Memoria executorului trebuie păstrată cât mai puțin posibil, deoarece poate duce la întârzierea colectării gunoiului JVM. Acest fapt este aplicabil și pentru executorii mici, deoarece mai multe sarcini pot rula pe o singură instanță JVM.

Data Locality

în Apache Spark, sarcinile de procesare sunt optimizate prin plasarea codului de execuție aproape de datele prelucrate, numit data locality. Uneori, sarcina de procesare trebuie să aștepte înainte de a obține date, deoarece datele nu sunt disponibile. Cu toate acestea, atunci când timpul de scânteie.localitate.așteptați expiră, Spark încearcă mai puțin nivel local, adică, Local la nodul la raft la orice.

transferul de date între discuri este foarte costisitor, astfel încât majoritatea operațiunilor trebuie efectuate la locul unde se află datele. Ajută la încărcarea doar mică, dar necesită cantitatea de date împreună cu dezvoltarea bazată pe teste pentru Apache Spark.

utilizarea Alăturărilor colocate

alăturările colocate iau decizii de redistribuire și difuzare. Putem defini seturi de date mici pentru a fi localizate în mai multe blocuri de memorie pentru a obține o mai bună utilizare a Radiodifuziunii. În timp ce Aplicați se alătură pe două seturi de date, spark sortează mai întâi datele ambelor seturi de date după cheie și le îmbină.

dar, putem aplica, de asemenea, sort partition key înainte de a le alătura sau în timp ce creați acele cadre de date Inapache Arrow Architecture. Acest lucru va optimiza timpul de rulare al interogării, deoarece nu ar exista apeluri de funcții inutile de sortat.

Caching în Spark

Caching în Apache Spark cu GPU este cea mai bună tehnică pentru optimizarea Apache Spark atunci când avem nevoie de date din nou și din nou. Dar nu este întotdeauna acceptabil să cache date.

trebuie să folosim cache () RDD și DataFrames în oricare dintre următoarele cazuri–

  • când există o buclă iterativă, cum ar fi în algoritmii de învățare automată.
  • când RDD este accesat de mai multe ori într-o singură lucrare sau activitate.
  • când costul pentru a genera din nou partițiile RDD este mai mare.

Cache () și persistă (StorageLevel.MEMORY_ONLY) pot fi utilizate în locul celuilalt. Fiecare partiție RDD care este evacuată din memorie trebuie să fie construită din nou de la sursa care este încă foarte scumpă. Una dintre cele mai bune soluții este utilizarea persist (nivel de stocare.MEMORY_AND_DISK_ONLY) care ar vărsa partițiile RDD pe discul local al lucrătorului. Acest caz necesită doar obținerea de date de pe unitatea locală a lucrătorului, care este relativ rapidă.

Dimensiunea executorului

Când rulăm executorii cu memorie ridicată, aceasta duce adesea la întârzieri excesive în colectarea gunoiului. Trebuie să păstrăm numărul de nuclee pe executor sub cinci sarcini pe executor. Executorii prea mici nu au ieșit la îndemână în ceea ce privește rularea mai multor locuri de muncă pe un singur JVM.

de exemplu, variabilele de difuzare trebuie reproduse pentru fiecare executor exact o dată, ceea ce va duce la mai multe copii ale datelor.

funcția de fereastră Spark

o funcție de fereastră definește un cadru prin care putem calcula rândurile de intrare ale unui tabel. La nivel de rând individual. Fiecare rând poate avea un cadru clar. Fereastra ne permite să definim o fereastră pentru date în cadrul de date. Putem compara mai multe rânduri în același cadru de date.

putem seta timpul ferestrei la un anumit interval care va rezolva problema dependenței de date cu datele anterioare. Amestecarea în Apache Beam este mai puțin pe datele prelucrate anterior, deoarece reținem aceste date pentru intervalul ferestrei.

tehnica filigranelor

filigranarea este o tehnică utilă în optimizarea Apache Spark care constrânge sistemul prin proiectare și ajută la prevenirea exploziei acestuia în timpul rulării. Filigranul are două argumente–

  • coloana pentru timpul evenimentului și
  • un timp de prag care specifică pentru cât timp suntem obligați să procesăm date târzii

interogarea din arhitectura săgeată Apache va fi actualizată automat dacă datele se încadrează în acel prag stipulat; în caz contrar, nu se declanșează nicio procesare pentru datele întârziate. Trebuie să ne amintim că putem folosi modul complet unul lângă altul cu filigranare, deoarece modul complet persistă mai întâi toate datele în tabelul rezultat.

serializarea datelor

optimizarea Apache Spark funcționează pe date pe care trebuie să le procesăm pentru unele cazuri de utilizare, cum ar fi analizele sau doar pentru mișcarea datelor. Această mișcare de date sau analize poate fi bine realizată dacă datele sunt într-un format mai bine serializat. Apache Spark acceptă serializarea datelor pentru a gestiona eficient formatele de date necesare la sursă sau destinație. În mod implicit, Apache Spark folosește serializarea Java, dar acceptă și serializarea Kryo.

în mod implicit, Spark utilizează Objectoutputstream Java pentru a serializa datele. Implementarea poate fi prin java.io.Clasă serializabilă. Codifică obiectele într-un flux de octeți. Oferă persistență ușoară și flexibilă. Dar devine lent, deoarece duce la formate serializate uriașe pentru fiecare clasă în care este utilizat. Spark acceptă Biblioteca de serializare Kryo (v4) pentru serializarea obiectelor de aproape 10 ori mai rapidă decât serializarea Java, deoarece este mai compactă decât Java.

Apache Spark Optimizare: O abordare cuprinzătoare

Apache Spark, un motor de calcul distribuit open-source, este în prezent cel mai popular cadru pentru procesarea lotului în memorie, care acceptă și streaming în timp real. Cu ajutorul optimizatorului avansat de interogare și a motorului de execuție, tehnicile de optimizare Apache Spark pot procesa și analiza seturi de date mari foarte eficient. Cu toate acestea, rularea tehnicilor de optimizare Apache Spark Join fără o reglare atentă poate degrada performanța. Dacă doriți să valorificați puterea aplicației Apache Spark, consultați serviciile noastre Apache Spark gestionate.

Categorii :

Dezvoltare De Date Mari, Soluții De Date Mari, Analiză De Date În Flux,

Partajare:

You might also like

Lasă un răspuns

Adresa ta de email nu va fi publicată.