Explorați cele mai bune practici pentru optimizarea performanței Spark-IBM Developer

count () pe un set de date este o acțiune scânteie. Este o problemă comună pe care am văzut în cazul în care există mai multe count() solicită în aplicații Spark care sunt adăugate în timpul depanare și ei nu te eliminat. Este o idee bună să căutați acțiuni Spark și să eliminați orice nu este necesar, deoarece nu dorim să folosim cicluri CPU și alte resurse atunci când nu este necesar.

formate de fișiere

când proiectați seturile de date pentru aplicația dvs., asigurați-vă că utilizați la maximum formatele de fișiere disponibile cu Spark. Unele lucruri de luat în considerare:

  • Spark este optimizat pentru Apache Parchet și ORC pentru citire tranzitată. Spark are suport pentru vectorizare care reduce I / O. formatele columnare funcționează bine.
  • utilizați formatul de fișier Parchet și să facă uz de compresie.
  • există diferite formate de fișiere și surse de date încorporate care pot fi utilizate în Apache Spark.Utilizați formate de fișiere splittable.
  • asigurați-vă că nu există prea multe fișiere mici. Dacă aveți multe fișiere mici, ar putea avea sens să le compactați pentru o performanță mai bună.

paralelism

  • creșteți numărul de partiții Spark pentru a crește paralelismul pe baza dimensiunii datelor. Asigurați-vă că resursele clusterului sunt utilizate optim. Prea puține partiții ar putea duce la faptul că unii executori sunt inactivi, în timp ce prea multe partiții ar putea duce la planificarea sarcinilor.
  • reglați partițiile și sarcinile. Spark poate gestiona sarcini de 100 ms+ și recomandă cel puțin 2-3 sarcini pe nucleu pentru un executor.
  • Spark decide numărul de partiții pe baza intrării dimensiunii fișierului. Uneori, este logic să specificați în mod explicit numărul de partiții.
    • API-ul de citire are un număr opțional de partiții.
    • scânteie.sql.fișiere.maxPartitionBytes, Disponibil în Spark v2.0.0, pentru parchet, ORC, și JSON.
  • partițiile shuffle pot fi reglate prin setarea spark.sql.amestecă.partiții, care implicit la 200. Acest lucru este foarte mic dacă aveți dimensiuni mari de seturi de date.

Reduce shuffle

Shuffle este o operație costisitoare, deoarece implică mutarea datelor peste nodurile din cluster, care implică rețea și disc I/O. este întotdeauna o idee bună pentru a reduce cantitatea de date care trebuie amestecate. Iată câteva sfaturi pentru a reduce amestecarea:

  • reglați scânteia .sql.amestecă.partiții.
  • partiționați setul de date de intrare în mod corespunzător, astfel încât fiecare dimensiune a sarcinii să nu fie prea mare.
  • utilizați UI Spark pentru a studia planul de a căuta posibilitatea de a reduce shuffle cât mai mult posibil.
  • Formula recomandare pentru spark.sql.amestecă.partiții:
    • pentru seturi de date mari, scopul pentru oriunde de la 100MB la mai puțin de 200MB sarcină dimensiunea țintă pentru o partiție (utilizați dimensiunea țintă de 100MB, de exemplu).
    • scânteie.sql.amestecă.partiții = coeficient (shuffle stage input size/target size)/total cores) * total cores.

filtrați / reduceți dimensiunea setului de date

căutați oportunități de filtrare a datelor cât mai curând posibil în conducta de aplicații. Dacă există o operație de filtrare și sunteți interesat doar să faceți analize pentru un subset de date, aplicați acest filtru din timp. Dacă puteți reduce dimensiunea setului de date mai devreme, faceți-o. Utilizați predicate de filtrare adecvate în interogarea SQL, astfel încât Spark să le poată împinge până la sursa de date de bază; predicatele selective sunt bune. Utilizați-le după caz. Utilizați filtre de partiție dacă sunt aplicabile.

Cache în mod corespunzător

Spark acceptă memorarea în cache a seturilor de date din memorie. Există diferite opțiuni disponibile:

  • utilizați cache-ul atunci când aceeași operație este calculată de mai multe ori în fluxul conductei.
  • utilizați cache-ul utilizând API-ul persist pentru a activa setarea cache necesară (persist pe disc sau nu; serializat sau nu).
  • fiți conștienți de încărcare leneș și prim cache, dacă este necesar în față. Unele API-uri sunt dornici, iar altele nu.
  • consultați fila Stocare Spark UI pentru a vedea informații despre seturile de date pe care le-ați memorat în cache.
  • este o practică bună să vă dezactivați setul de date din cache atunci când ați terminat să le utilizați pentru a elibera resurse, în special atunci când aveți și alte persoane care utilizează clusterul.

Alăturați-vă

Alăturați-vă este, în general, o operațiune costisitoare, deci acordați atenție îmbinărilor din aplicația dvs. pentru a le optimiza. BroadcastHashJoin este cel mai performant pentru cazurile în care una dintre relații este suficient de mică încât să poată fi difuzată. Mai jos sunt câteva sfaturi:

  • Alăturați-vă problemelor de ordine; începeți cu cea mai selectivă alăturare. Pentru relații mai mici de scânteie.sql.autoBroadcastJoinThreshold, puteți verifica dacă difuzare HashJoin este preluat.
  • Utilizați indicii SQL dacă este necesar pentru a forța un anumit tip de asociere.
    • exemplu: când vă alăturați unui set de date mic cu un set de date mare, o asociere de difuzare poate fi forțată să difuzeze setul de date mic.
    • confirmați că Spark ridică hash-ul difuzat; dacă nu, îl puteți forța folosind indiciul SQL.
  • evitați îmbinările încrucișate.
  • Broadcast HashJoin este cel mai performant, dar poate să nu fie aplicabil dacă ambele relații din join sunt mari.
  • colectați statistici pe tabele pentru Spark pentru a calcula un plan optim.

reglați resursele clusterului

  • reglați resursele de pe cluster în funcție de managerul de resurse și de versiunea Spark.
  • reglați memoria disponibilă la driver: spark.șofer.memorie.
  • Reglați numărul de executori și memoria și utilizarea de bază pe baza resurselor din cluster: executor-memorie, num-executori și executor-nuclee.

consultați documentația de configurare pentru eliberarea scânteii cu care lucrați și utilizați parametrii corespunzători.

evitați operațiunile costisitoare

  • evitați comandați de dacă nu este necesar.
  • când scrieți interogările, în loc să utilizați select * pentru a obține toate coloanele, preluați numai coloanele relevante pentru interogarea dvs.
  • nu apelați numărul inutil.

date oblic

  • asigurați-vă că partițiile sunt egale în dimensiune pentru a evita oblic de date și probleme de utilizare CPU scăzut.
    • ca exemplu: dacă aveți date care vin dintr-o sursă de date JDBC în paralel și fiecare dintre aceste partiții nu recuperează un număr similar de înregistrări, acest lucru va duce la sarcini de dimensiuni inegale (o formă de înclinare a datelor). Poate că o partiție este doar câteva KB, în timp ce alta este câteva sute de MB. Unele sarcini vor fi mai mari decât altele și, în timp ce executorii pe sarcini mai mari vor fi ocupați, ceilalți executori, care se ocupă de sarcina mai mică, vor termina și vor fi inactivi.
    • dacă datele de la sursă nu sunt partiționate optim, puteți evalua, de asemenea, compromisurile utilizării repartiției pentru a obține o partiție echilibrată și apoi utilizați cache-ul pentru a-l persista în memorie, dacă este cazul.
  • repartiția va provoca o amestecare, iar amestecarea este o operație costisitoare, deci aceasta ar trebui evaluată pe baza unei aplicații.
  • utilizați UI Spark pentru a căuta dimensiunile partițiilor și durata activității.

UDFs

Spark are un număr de built-in funcții definite de utilizator (UDFs) disponibile. Pentru performanță, verificați dacă puteți utiliza una dintre funcțiile încorporate, deoarece acestea sunt bune pentru performanță. UDF-urile personalizate din API-ul Scala sunt mai performante decât UDF-urile Python. Dacă trebuie să utilizați API-ul Python, utilizați pandas UDF nou introdus în Python care a fost lansat în Spark 2.3. Suportul pandas UDF (UDFs vectorizat) din Spark are îmbunătățiri semnificative ale performanței, spre deosebire de scrierea unui UDF Python personalizat. Obțineți mai multe informații despre scrierea unui panda UDF.

sper că acest lucru a fost util pentru tine ca te duci despre scris aplicațiile Spark. Dezvoltare fericită! Într-un blog viitoare, voi arăta cum să obțineți planul de execuție pentru locul de muncă Spark.

Lasă un răspuns

Adresa ta de email nu va fi publicată.