Understanding persistence in Apache Spark

Reading Time: 4 minutes

in this blog, we will try to understand the concept of Persistence in Apache Spark in a very maallikko term with scenario-based examples.
huomaa: skenaariot on tarkoitettu vain helppotajuisiksi.

Spark Architecture

Huomautus: Välimuistimuisti voidaan jakaa suorittajien kesken.

mitä RDD: n jatkuva / välimuistiin tallentaminen tarkoittaa?

Spark RDD-pysyvyys on optimointitekniikka, joka tallentaa RDD-arvioinnin tuloksen välimuistiin. Tällä säästämme välituloksen, jotta voimme tarvittaessa käyttää sitä edelleen. Se vähentää laskennan yläpuolella.

kun jatkamme RDD: tä, jokainen solmu tallentaa sen laskemat osiot muistiin ja käyttää ne uudelleen muissa toiminnoissa kyseiseen RDD: hen (tai siitä johdettuun RDD: hen). Näin tulevat toimet voivat olla paljon nopeampia (usein yli 10x). Välimuistin tallentaminen on keskeinen työkalu iteratiivisille algoritmeille ja nopealle interaktiiviselle käytölle.

voit merkitä RDD: n jatkettavaksi käyttäen siihen persist() tai cache() – menetelmiä. Kun se lasketaan ensimmäisen kerran toimessa, se säilytetään välimuistissa solmuissa. Spark ’ s cache on vikasietoinen – jos jokin RDD: n osio menetetään, se lasketaan automaattisesti uudelleen käyttäen muunnoksia, jotka sen alun perin loivat.

sanotaan, että minulla on tämä muodonmuutos–

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

rdd3 luodaan rdd2: sta ja RDD2: sta rdd1: stä. Joka kerta kun teemme muutoksen rdd3: lla, rdd2 ja RDD1 on laskettava uudelleen ja uudelleen.

RDD4.collect()RDD5.collect()

tässä koko muuntumisketju on laskettava kahteen kertaan.

mutta voimme säilyttää tämän RDD3: n Työsolmun välimuistiin niin, että joka kerta kun käytämme sitä, RDD2: ta ja RDD1: tä ei tarvitse laskea uudelleen.

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

tässä lasketaan rdd5 Spark lukee välimuistista rdd3 ja tuottaa tuloksen. Näin ollen rdd2: ta ja RDD1: tä ei lasketa uudelleen rdd5

Huomautus: rdd.välimuisti () on sama kuin rdd.säilyvyys ()

Pysyvyystasot

tallennuspaikka

– MEMORY_ONLY (oletusarvo) – sama kuin välimuisti
rdd.säilyneet (StorageLevel.MEMORY_ONLY) tai rdd.jatkuva ()

– MEMORY_AND_DISK-tallentaa levylle osioita, jotka eivät mahdu muistiin (tätä kutsutaan myös Läikyttämiseksi)
rdd.säilyneet (StorageLevel.MEMORY_AND_DISK)

– DISK_ONLY-tallentaa kaikki osiot levylle
rdd.säilyneet (StorageLevel.DISK_ONLY)

– MEMORY_ONLY (oletus) – tämä on yksinkertaisin ja suositeltavin käyttää. Se tallentaa kaikki RDD: n osiot välimuistiin.

– DISK_ONLY-sanotaan, että minulla on RDD (nimeltään RDD1) ja tuon RDD: n laskenta on hyvin monimutkaista (aikaa vievää, luotu ML-algoritmin soveltamisen jälkeen) ja RDD on valtava kooltaan ja käytettävissä oleva välimuisti Työntekijäsolmussa on vähemmän, joten emme voi tallentaa RDD: tä välimuistiin. Tässä tapauksessa voimme tallentaa RDD levylle.

saatat ihmetellä, mitä järkeä on tallentaa levylle?

ehdottomasti, jos Tallennamme RDD: n levylle, tulee I/O, mikä on aikaa vievää. Mutta meidän on varmistettava, että onko I/O kestää kauan tai uudelleen laskenta RDD kestää kauemmin. Nyt, jos voimme selvittää, että I / O vie vähemmän aikaa sitten uudelleen laskenta RDD, niin siinä tapauksessa, se on parempi tallentaa RDD levylle.

joten aina kun rdd1 vaaditaan seuraavan kerran myöhemmässä muutoksessa, niin Spark tekee I / O-operaation ja tuo sen toimeenpanijan muistiin.

RDD1.säilyneet (StorageLevel.DISK_ONLY)

– MEMORY_AND_DISK-sanotaan, että minulla on 3 RDD: tä (yksikään ei ole välimuistissa) toimeenpanijan muistissa, eikä käytettävissä olevaa muistia ole jäljellä. Samaan aikaan tulee toinen RDD (sano rdd4). Joten Spark poistaa vähiten Käytetyn (LRU) RDD: n toimeenpanijan muistista ja tekee tilaa uudelle RDD: lle (tässä tapauksessa RDD4).

oletetaan nyt, että 3 RDD: tä tallennetaan muistiin välimuistiin ja kun rdd4 saapuu, LRU ei potkaise yhtään RDD: tä Työntekijäsolmun välimuistista. Ja voi olla ongelmia.

mutta jos käytämme MEMORY_AND_DISK persistence-tasoa rdd4: n kanssa, niin Rdd4 tallennetaan levylle, jos se ei löydä tarpeeksi tilaa välimuistista.

RDD4.säilyneet (StorageLevel.MEMORY_AND_DISK)

myös, jos valtava RDD on välimuistissa muistissa eikä välimuistissa ole tarpeeksi välimuistia, loput osiot, jotka eivät mahdu välimuistiin, valuvat levylle, jos käytämme MEMORY_AND_DISK.

jälleen haasteena ovat I / O-operaatiot.

huomaa: levyllä säilyneet tiedot tallennetaan tmp: n sijaintiin.

Muistimuoto

sarjallistaminen – voimme valita välimuistiin tallennettujen tietojen sarjallistamisen.

MEMORY_ONLY_SER ja MEMORY_AND_DISK_SER

RDD: n jatkaminen sarjamuodossa (binäärimuodossa) auttaa pienentämään RDD: n kokoa, jolloin välimuistiin jää enemmän tilaa RDD: lle. Nämä kaksi muistiformaattia ovat siis tilatehokkaita.

mutta ongelmana tässä on se, että ne ovat vähemmän aikaa tehokkaita, koska meidän on maksettava kustannukset aikaa mukana deserializing tiedot.

joten on kehittäjän valinta, onko suorituskyvyllä vai tallennuksella väliä. Ehdottomasti suoritusvaikutus ei olisi paljon, mutta se olisi minuutti yksi.

Partition replikointi

tallentaa osion kahteen solmuun.

DISK_ONLY_2
MEMORY_AND_DISK_2
MEMORY_ONLY_2
MEMORY_AND_DISK_SER_2
MEMORY_ONLY_SER_2

nämä valinnat tallentavat RDD: n kopioinnin myös jonkun toisen Työsolmun välimuistiin.

levyllä toistettuja tietoja käytetään osion uudelleenluomiseen ts. se auttaa palauttamaan RDD jos toinen työntekijä solmu menee alas.

jatkuva RDD

– lopettaa jatkuva ja poistaa muistista tai levyltä
– muuttaa RDD: n pysyvyystasoa
rdd.unpersist ()

näin Apache Sparkissa voidaan siis toimia välimuistin muistilla.

tämä kaikki tästä blogista, toivottavasti nautit siitä ja se auttoi sinua!! Pysy yhteydessä lisää tulevia blogeja. Kiitoksia!!

Vastaa

Sähköpostiosoitettasi ei julkaista.