Înțelegerea persistenței în Apache Spark

timp de citire: 4 minute

în acest blog, vom încerca să înțelegem conceptul de persistență în Apache Spark într-un termen foarte laic cu exemple bazate pe scenarii.
notă: scenariile sunt destinate doar înțelegerii dvs. ușoare.

arhitectura Spark

notă: memoria Cache poate fi partajată între executori.

ce înseamnă persistența/memorarea în cache a unui RDD?

persistența RDD Spark este o tehnică de optimizare care salvează rezultatul evaluării RDD în memoria cache. Folosind acest lucru salvăm rezultatul intermediar, astfel încât să îl putem folosi în continuare, dacă este necesar. Aceasta reduce cheltuielile generale de calcul.

când persistăm un RDD, fiecare nod stochează partițiile acestuia pe care le calculează în memorie și le reutilizează în alte acțiuni pe acel RDD (sau RDD derivat din acesta). Acest lucru permite acțiunilor viitoare să fie mult mai rapide (adesea cu mai mult de 10x). Cache-ul este un instrument cheie pentru algoritmi iterativi și utilizare interactivă rapidă.

puteți marca un RDD pentru a fi persistat folosind metodele persist() sau cache() de pe acesta. Prima dată când este calculat într-o acțiune, acesta va fi păstrat în memoria cache pe noduri. Cache-ul Spark este tolerant la erori – dacă se pierde orice partiție a unui RDD, acesta va fi recalculat automat folosind transformările care l-au creat inițial.

să spunem că am această transformare–

RDD3 => RDD2 => RDD1 => Text FileRDD4 => RDD3RDD5 => RDD3

RDD3 este creat din RDD2 și RDD2 este creat din RDD1. De fiecare dată când facem o transformare pe RDD3, atunci RDD2 și RDD1 trebuie recalculate din nou și din nou.

RDD4.collect()RDD5.collect()

aici, întregul lanț de transformare trebuie calculat de două ori.

dar putem persista acest RDD3 în memoria cache a nodului lucrător, astfel încât de fiecare dată când îl folosim, RDD2 și RDD1 nu trebuie recalculate.

RDD3.cache()RDD4.collect()//The first action which involves RDD3 will store it in cache memoryRDD5.collect()

aici, pentru a calcula RDD5 Spark va citi RDD3 din memoria cache și va genera rezultatul. Prin urmare, RDD2 și RDD1 nu vor fi recalculate pentru RDD5

notă: rdd.cache () este la fel ca rdd.persistă ()

niveluri de persistență

locație de stocare

– MEMORY_ONLY (implicit) – la fel ca memoria cache
rdd.persista (StorageLevel.MEMORY_ONLY) sau rdd.persist ()

– MEMORY_AND_DISK – stochează partiții pe disc care nu se încadrează în memorie (aceasta se mai numește deversare)
rdd.persista (StorageLevel.MEMORY_AND_DISK)

– DISK_ONLY – stochează toate partițiile de pe disc
rdd.persista (StorageLevel.DISK_ONLY)

– MEMORY_ONLY (implicit) – acesta este cel mai simplu și mai recomandat de utilizat. Stochează toate partițiile RDD în memoria cache.

– DISK_ONLY – să spunem că am un RDD (numit RDD1) și calculul acelui RDD este foarte complicat (consumatoare de timp, creat după aplicarea unui algoritm ML), iar RDD are dimensiuni uriașe și memoria cache disponibilă în nodul lucrător este mai mică, deci nu putem salva RDD în memoria cache. În acest caz, putem salva RDD pe disc.

s-ar putea să vă întrebați Ce rost are stocarea pe disc?

categoric, dacă vom stoca RDD în disc atunci I/o va avea loc, care este consumatoare de timp. Dar trebuie să ne asigurăm că dacă I / O durează mult timp sau re-calculul RDD durează mai mult timp. Acum, dacă putem afla că I / O este de a lua mai puțin timp, apoi re-calcul de RDD, apoi, în acest caz, este mai bine pentru a stoca RDD în disc.

deci, ori de câte ori RDD1 este necesar data viitoare în transformarea ulterioară, atunci Spark va face o operație I/O și o va aduce în memoria executorului.

RDD1.persista (StorageLevel.DISK_ONLY)

– MEMORY_AND_DISK – să presupunem că am 3 RDDs (niciunul nu este memorat în cache) în memoria executorului și nu a mai rămas memorie disponibilă. Între timp, vine un alt RDD (să zicem RDD4). Deci, Spark va elimina RDD-ul cel mai puțin folosit recent (LRU) din memoria executorului și va face spațiu pentru ca noul RDD să intre (în acest caz RDD4).

acum, să presupunem că 3 RDD-uri sunt memorate în memorie și când RDD4 ajunge LRU nu va da afară orice RDD din memoria cache a nodului lucrător. Și pot exista probleme OOM.

dar dacă folosim nivelul de persistență MEMORY_AND_DISK cu RDD4, atunci RDD4 va fi stocat pe disc, dacă nu găsește suficient spațiu în memoria cache.

RDD4.persista (StorageLevel.MEMORY_AND_DISK)

de asemenea, dacă un RDD imens este memorat în memorie și nu există suficientă memorie cache, atunci partițiile rămase care nu se pot încadra în memoria cache sunt vărsate pe disc dacă folosim MEMORY_AND_DISK.

din nou provocarea aici este i/o operațiuni.

notă: datele persistate în disc sunt stocate în locația tmp.

format memorie

serializare – putem alege să serializăm datele stocate în memoria cache.

MEMORY_ONLY_SER și MEMORY_AND_DISK_SER

persistând RDD într-o formă serializată (binară) ajută la reducerea dimensiunii RDD, făcând astfel spațiu pentru ca mai multe RDD să fie persistate în memoria cache. Deci aceste două formate de memorie sunt eficiente din punct de vedere spațial.

dar problema cu aceasta este că acestea sunt mai puțin eficiente în timp, deoarece trebuie să suportăm costul timpului implicat în deserializarea datelor.

deci este alegerea dezvoltatorului dacă performanța contează sau stocarea contează. Cu siguranță, impactul asupra performanței nu ar fi mult, dar ar fi un minut.

replicarea partiției

stochează partiția pe două noduri.

DISK_ONLY_2
MEMORY_AND_DISK_2
MEMORY_ONLY_2
MEMORY_AND_DISK_SER_2
MEMORY_ONLY_SER_2

aceste opțiuni stochează o copie reprodusă a RDD în memoria cache a unui alt nod lucrător.

datele reproduse pe disc vor fi folosite pentru a recrea partiția, adică. ajută la recalcularea RDD dacă celălalt nod lucrător coboară.

Nepersistant RDD

– pentru a opri persistența și a elimina din memorie sau disc
– pentru a modifica nivelul de persistență al RDD
rdd.unpersist ()

deci, acest lucru cum putem lucra cu memoria cache în Apache Spark.

toate acestea sunt de pe acest blog, sper că v-a plăcut și v-a ajutat!! Rămâneți conectat pentru mai multe bloguri viitoare. Mulțumesc!!

Lasă un răspuns

Adresa ta de email nu va fi publicată.