Forstå utholdenhet I Apache Spark

Lesetid: 4 minutter

i denne bloggen vil vi prøve å forstå Begrepet Utholdenhet I Apache Spark i en veldig lekmann term med scenario-baserte eksempler.
Merk: scenariene er bare ment for din enkle forståelse.

Gnistarkitektur

Merk: Cache-minne kan deles mellom Eksekutorer.

hva betyr det ved å fortsette / caching en RDD?

Spark RDD persistence er en optimaliseringsteknikk som lagrer resultatet AV rdd-evaluering i hurtigminnet. Ved hjelp av dette lagrer vi mellomresultatet slik at vi kan bruke det videre om nødvendig. Det reduserer beregningen overhead.

når VI fortsetter EN RDD, lagrer hver node partisjonene av den som den beregner i minnet og gjenbruker dem i andre handlinger på DEN RDD (ELLER RDD avledet fra den). Dette gjør at fremtidige handlinger kan være mye raskere (ofte med mer enn 10x). Caching er et viktig verktøy for iterative algoritmer og rask interaktiv bruk.

du kan merke EN RDD som skal vedvare ved hjelp av metodene persist() eller cache() på den. Første gang det er beregnet i en handling, vil det bli holdt i cache-minne på nodene. Sparks cache er feiltolerant – hvis en partisjon av EN RDD går tapt, blir den automatisk beregnet på nytt ved hjelp av transformasjonene som opprinnelig opprettet den.

La oss si at jeg har denne transformasjonen–

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

RDD3 er opprettet FRA RDD2 OG RDD2 er opprettet fra RDD1. Hver gang VI gjør en transformasjon PÅ RDD3, MÅ RDD2 og RDD1 omregnes igjen og igjen.

RDD4.collect()RDD5.collect()

her må hele transformasjonskjeden beregnes to ganger.

Men VI kan fortsette DENNE RDD3 i bufferminnet Til Arbeidernoden, slik at HVER gang VI bruker DEN, TRENGER RDD2 og RDD1 ikke å bli beregnet på nytt.

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

her, for å beregne RDD5 Spark vil lese RDD3 fra hurtigminnet og generere resultatet. DERFOR VIL RDD2 og RDD1 ikke bli beregnet på NYTT for RDD5

Merk: rdd.cache () er samme som rdd.persist()

Persistensnivåer

Lagringssted

– MEMORY_ONLY (standard) – samme som cache
rdd.vedvarer(StorageLevel.MEMORY_ONLY) eller rdd.persist ()

rdd.vedvarer(StorageLevel.MEMORY_AND_DISK )

– DISK_ONLY-Lagrer alle partisjoner på disken
rdd.vedvarer(StorageLevel.DISK_ONLY )

– DISK_ONLY-la oss si at jeg har EN RDD (kalt RDD1) og beregningen av DEN RDD er svært komplisert (tidkrevende, opprettet etter å ha brukt EN ML-algoritme) og RDD er stor i størrelse og tilgjengelig cache-minne i Arbeidernoden er mindre, så vi kan ikke lagre RDD i cacheminnet. I dette tilfellet kan VI lagre RDD i DISKEN.

du lurer kanskje på hva som er poenget med lagring I Disk?

Definitivt, hvis VI lagrer RDD i Disken, vil I/O oppstå, noe som er tidkrevende. Men vi må sørge for at om I / O tar lang tid eller omberegningen av RDD tar lengre tid. Nå, hvis vi kan finne ut at I / O tar mindre tid enn re-beregning AV RDD, så i så fall er det bedre å lagre RDD I Disken.

så, når RDD1 kreves neste gang i den påfølgende transformasjonen, Vil Spark gjøre en i / O-operasjon og bringe den til Eksekutorens minne.

RDD1.vedvarer(StorageLevel.DISK_ONLY)

nå, la oss anta at 3 RDDs er bufret i minnet, og NÅR RDD4 kommer, vil LRU ikke sparke ut NOEN RDD fra Hurtigminnet Til Arbeidernoden. OG DET kan være OOM problemer.

men hvis VI bruker MEMORY_AND_DISK persistensnivå med RDD4, blir RDD4 lagret i Disken, hvis den ikke finner nok plass i hurtigminnet.

RDD4.vedvarer(StorageLevel.MEMORY_AND_DISK)

Også, Hvis en stor RDD er bufret i minnet, og det ikke er nok cache-minne, blir de resterende partisjonene som ikke kan passe inn i cacheminnet, spilt til Disk hvis vi bruker MEMORY_AND_DISK.

igjen er utfordringen her i / o-operasjoner.

Merk: dataene som vedvarer I Disken, lagres i tmp-plassering.

Minneformat

Serialisering – vi kan velge å serialisere dataene som er lagret i hurtigminnet.

MEMORY_ONLY_SER og MEMORY_AND_DISK_SER

Vedvarende RDD i en serialisert (binær) form bidrar til å redusere STØRRELSEN PÅ RDD, noe som gjør plass til mer RDD å være vedvarende i hurtigminnet. Så disse to minneformatene er plassbesparende.

men problemet med dette Er at de er mindre tidseffektive fordi vi må pådra seg kostnaden for tid involvert i deserialisering av dataene.

så det er en utviklerens valg om ytelsen er viktig eller lagringen er viktig. Definitivt vil ytelseseffekten ikke være mye, men det ville være et minutt en.

Partisjonsreplikasjon

Lagrer partisjonen på to noder.

DISK_ONLY_2
MEMORY_AND_DISK_2
MEMORY_ONLY_2
MEMORY_AND_DISK_SER_2
MEMORY_ONLY_SER_2

disse alternativene lagrer en replikert kopi av RDD i en Annen Arbeidernodes cache-minne også.

Replikerte data på disken vil bli brukt til å gjenskape partisjonen dvs. det bidrar til å beregne RDD hvis den andre arbeidernoden går ned.

Unpersisting RDD

– for å endre EN RDDS utholdenhetsnivå
rdd.unpersist ()

så, slik kan vi jobbe med hurtigminnet Vårt I Apache Spark.

dette er alt fra denne bloggen, håper du likte det, og det hjalp deg!! Hold kontakten for flere fremtidige blogger. Thank you!!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.