Tutustu Spark-suorituskyvyn optimoinnin parhaisiin käytäntöihin-IBM Developer

count () datajoukossa on Kipinätoiminto. Se on yleinen ongelma, että olen nähnyt, että on olemassa useita count() kutsuja Kipinäsovelluksissa, jotka lisätään virheenkorjauksen aikana ja niitä ei poisteta. On hyvä idea etsiä kipinä toimintoja ja poistaa kaikki, jotka eivät ole välttämättömiä, koska emme halua käyttää CPU syklit ja muita resursseja, kun ei tarvita.

tiedostomuodot

kun suunnittelet tietokokonaisuuksia sovellukseesi, varmista, että käytät parhaalla mahdollisella tavalla Sparkilla saatavilla olevia tiedostomuotoja. Huomioitavaa:

  • Spark on optimoitu Apache parketille ja ORC: lle lukunopeutta varten. Spark on vektorointi tuki, joka vähentää levyn I / O. Columnar formaatit toimivat hyvin.
  • käytä parketin tiedostomuotoa ja hyödynnä puristusta.
  • Apache Sparkissa voidaan käyttää erilaisia tiedostomuotoja ja sisäänrakennettuja tietolähteitä.Käytä jaettavia tiedostomuotoja.
  • varmista, ettei pieniä tiedostoja ole liikaa. Jos sinulla on monia pieniä tiedostoja, se voi olla järkevää tehdä tiivistys niistä paremman suorituskyvyn.

Parallelismi

  • lisää Kipinäosioiden määrää parallelismin lisäämiseksi aineiston koon perusteella. Varmista, että klusteriresurssit hyödynnetään optimaalisesti. Liian harvat osiot voivat johtaa siihen, että jotkut suorittajat ovat tyhjäkäynnillä, kun taas liian monet osiot voivat johtaa tehtävien ajoitukseen.
  • Viritä osiot ja tehtävät. Spark pystyy käsittelemään 100ms+: n tehtäviä ja suosittelee suorittajalle vähintään 2-3 tehtävää per ydin.
  • kipinä päättää osioiden määrän tiedostokokon syötön perusteella. Toisinaan on järkevää määritellä osioiden määrä yksiselitteisesti.
    • lukurajapinta ottaa valinnaisen määrän osioita.
    • kipinä.sql.tiedosto.maxPartitionBytes, saatavilla Spark v2.0: ssa.0, parketti, örkki, ja JSON.
  • shuffle-väliseinät voidaan virittää asettamalla kipinä.sql.Shuffle.osiot, jonka oletusarvo on 200. Tämä on todella pieni, jos sinulla on suuria aineistokokoja.

Reduce shuffle

Shuffle on kallis operaatio, koska siihen liittyy datan siirtäminen klusterin solmujen yli, johon liittyy verkko-ja levy I/O. on aina hyvä ajatus vähentää sekoitettavan datan määrää. Tässä muutamia vinkkejä shufflen vähentämiseksi:

  • Viritä kipinä.sql.Shuffle.osiot.
  • Osioi syöteaineisto sopivasti, jotta jokainen tehtävän koko ei ole liian suuri.
  • käytä Spark UI-käyttöliittymää tutkiaksesi suunnitelmaa ja etsiäksesi mahdollisuutta vähentää shufflea mahdollisimman paljon.
  • Kaavasuositus kipinä.sql.Shuffle.väliseinät:
    • suurten datajoukkojen osalta tavoitteena on missä tahansa 100MB: stä alle 200MB: n tehtävän kohdekoko osiolle (käytä esimerkiksi 100MB: n tavoitekokoa).
    • kipinä.sql.Shuffle.osiot = osamäärä (shuffle stage input size / target size) / yhteensä ytimet) * yhteensä ytimet.

suodata / Pienennä tietokokoa

etsi mahdollisuuksia suodattaa tietoja mahdollisimman varhaisessa vaiheessa sovellusputkessa. Jos käytössä on suodatustoiminto ja olet kiinnostunut tekemään analyysin vain osajoukolle tiedoista, käytä tätä suodatinta aikaisin. Jos voit pienentää aineiston kokoa aikaisin, tee se. Käytä sopivia suodatin predikaatteja SQL-kyselyssäsi, jotta Spark voi työntää ne alas taustalla olevaan datalähteeseen; selektiiviset predikaatit ovat hyviä. Käytä niitä tarpeen mukaan. Käytä osiosuodattimia, jos ne ovat sovellettavissa.

välimuistin sopivasti

kipinä tukee aineistojen välimuistia muistissa. Tarjolla on erilaisia vaihtoehtoja:

  • käytä välimuistia, kun sama toiminto lasketaan useita kertoja putkivirrassa.
  • käytä välimuistia käyttäen itsepintaista API: a, jotta voit ottaa käyttöön vaaditun välimuistiasetuksen (säily levylle tai ei; sarjatuotantoon tai ei).
  • ole tietoinen laiskasta latauksesta ja prime-välimuistista tarvittaessa etukäteen. Osa apeista on innokkaita ja osa ei.
  • Katso Spark UI: n Tallennusvälilehdestä tiedot välimuistiin tallentamistasi aineistoista.
  • on hyvä käytäntö lakkauttaa välimuistissa oleva tietokokonaisuus, kun olet valmis käyttämään niitä resurssien vapauttamiseksi, erityisesti silloin, kun klusteria käyttävät myös muut ihmiset.

Join

Join on yleensä kallis operaatio, joten kiinnitä hakemuksessasi huomiota liittymiin niiden optimoimiseksi. BroadcastHashJoin toimii parhaiten tapauksissa, joissa jokin relaatioista on niin pieni, että se voidaan lähettää. Alla vinkkejä:

  • Join order matters; aloita kaikkein valikoiva liittyä. Alle kipinä.sql.autobroadcastjointreshold, voit tarkistaa, onko broadcast HashJoin noudettu.
  • käytä SQL-vihjeitä tarvittaessa tietyn tyyppisten liittymien pakottamiseen.
    • esimerkki: Kun pieni datajoukko yhdistetään suureen datajoukkoon, lähetysliittymä voidaan pakottaa lähettämään pieni datajoukko.
    • Vahvista, että Spark poimii broadcast hash-liittymän; jos ei, sen voi pakottaa SQL-vihjeellä.
  • Vältä ristiliitoksia.
  • Broadcast HashJoin on suorituksellisin, mutta ei välttämättä sovellettavissa, jos molemmat suhteet joinissa ovat suuria.
  • kerää taulukoista tilastoja Sparkille optimaalisen suunnitelman laskemiseksi.

Viritä klusterin resurssit

  • Viritä klusterin resurssit riippuen resurssienhallinnasta ja Spark-versiosta.
  • Viritä käytettävissä oleva muisti kuljettajalle: kipinä.ohjain.muisti.
  • Viritä suorittajien määrä sekä muistin ja ytimen käyttö klusterin resurssien perusteella: toimeenpanija-muisti, num-Suorittaja ja toimeenpanija-ytimet.

Tarkista käsittelemäsi Kipsijulkaisun konfiguraatio-ohjeet ja käytä sopivia parametreja.

vältä kalliita operaatioita

  • Vältä tilausta, jos sitä ei tarvita.
  • kun kirjoitat kyselyjäsi, sen sijaan että käyttäisit select * – toimintoa saadaksesi kaikki sarakkeet, Hae vain kyselysi kannalta merkitykselliset sarakkeet.
  • älä soita kreiville turhaan.

Data skew

  • varmista, että osiot ovat samankokoisia, jotta vältetään datan vääristyminen ja alhaiset suorittimen käyttöongelmat.
    • esimerkkinä: jos tiedot tulevat JDBC: n tietolähteestä rinnakkain, eikä mikään näistä osioista nouda samanlaista määrää tietueita, tämä johtaa epätasa-arvoisiin tehtäviin (eräänlaiseen tietojen vääristymiseen). Ehkä yksi osio on vain muutama KB, kun taas toinen on muutama sata MT. Jotkut tehtävät ovat suurempia kuin toiset, ja kun suurempien tehtävien suorittajat ovat kiireisiä, muut suorittajat, jotka käsittelevät pienempää tehtävää, lopettavat ja ovat tyhjäkäynnillä.
    • jos lähdetietoja ei ole jaoteltu optimaalisesti, voit myös arvioida repartitionilla saatavan tasapainoisen osion ja tarvittaessa säilyttää sen muistissa Välimuistin avulla.
  • Repartition aiheuttaa shuffle, ja shuffle on kallista toimintaa, joten tämä olisi arvioitava sovelluksen perusteella.
  • käytä Spark UI-käyttöliittymää osioiden koon ja tehtävän keston etsimiseen.

UDFs

Sparkissa on useita sisäänrakennettuja käyttäjän määrittämiä toimintoja (UDFs). Suorituskyvyn, tarkista, jos voit käyttää jotain sisäänrakennettu toimintoja, koska ne ovat hyviä suorituskykyä. Mukautetut UDF: t Scala API: ssa ovat performantimpia kuin Python UDFs. Jos joudut käyttämään Python API: a, käytä Spark 2.3: ssa julkaistua pandas UDF: ää Pythonissa. Pandas UDF (vectorized UDFs) tuki Spark on merkittäviä suorituskyvyn parannuksia verrattuna kirjallisesti mukautetun Python UDF. Saat lisätietoja pandas UDF: n kirjoittamisesta.

toivottavasti tästä oli apua, kun lähdit kirjoittamaan kipinä-hakemuksiasi. Happy developing! Tulevassa blogissa näytän, miten saat toteutussuunnitelman Kipinätyöhösi.

Vastaa

Sähköpostiosoitettasi ei julkaista.