Pochopení persistence v Apache Spark

doba čtení: 4 minuty

v tomto blogu se pokusíme pochopit koncept Persistence v Apache Spark ve velmi laickém termínu s příklady založenými na scénářích.
Poznámka: scénáře jsou určeny pouze pro vaše snadné pochopení.

Spark Architektura

Poznámka: vyrovnávací paměť může být sdílena mezi exekutory.

co to znamená přetrvávající / ukládání do mezipaměti RDD?

Spark RDD persistence je optimalizační technika, která ukládá výsledek vyhodnocení RDD do vyrovnávací paměti. Pomocí tohoto uložíme průběžný výsledek, abychom jej mohli v případě potřeby dále použít. Snižuje výpočetní režii.

když přetrváváme RDD, každý uzel ukládá jeho oddíly, které vypočítává v paměti, a znovu je používá v jiných akcích na tomto RDD (nebo RDD z něj odvozených). To umožňuje, aby budoucí akce byly mnohem rychlejší(často o více než 10x). Caching je klíčovým nástrojem pro iterační algoritmy a rychlé interaktivní použití.

můžete označit RDD, které má přetrvávat, pomocí metod persist() nebo cache(). Při prvním výpočtu v akci bude uložen v mezipaměti v uzlech. Mezipaměť Spark je odolná proti chybám – pokud dojde ke ztrátě jakéhokoli oddílu RDD, bude automaticky přepočítána pomocí transformací, které ji původně vytvořily.

řekněme, že mám tuto transformaci–

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

RDD3 je vytvořen z RDD2 a RDD2 je vytvořen z RDD1. Pokaždé, když provedeme transformaci na RDD3, je třeba znovu a znovu přepočítat RDD2 a RDD1.

RDD4.collect()RDD5.collect()

zde je třeba vypočítat celý řetězec transformace dvakrát.

ale můžeme tento RDD3 přetrvávat do vyrovnávací paměti pracovního uzlu, takže při každém použití nemusí být RDD2 a RDD1 znovu vypočteny.

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

zde pro výpočet RDD5 Spark přečte RDD3 z vyrovnávací paměti a vygeneruje výsledek. Proto RDD2 a RDD1 nebudou přepočítány pro RDD5

Poznámka: rdd.cache () je stejná jako rdd.persist ()

úrovně Persistence

umístění úložiště

– MEMORY_ONLY (výchozí) – stejné jako cache
rdd.persist(StorageLevel.MEMORY_ONLY) nebo rdd.persist ()

– MEMORY_AND_DISK-ukládá diskové oddíly, které se nevejdou do paměti (tomu se také říká rozlití)
rdd.persist(StorageLevel.MEMORY_AND_DISK)

– DISK_ONLY-ukládá všechny oddíly na disku
rdd.persist(StorageLevel.DISK_ONLY)

– MEMORY_ONLY (výchozí) – toto je nejjednodušší a nejvíce doporučené použití. Ukládá všechny oddíly RDD do vyrovnávací paměti.

– DISK_ONLY – řekněme, že mám RDD (s názvem RDD1) a výpočet tohoto RDD je velmi komplikovaný (časově náročný, vytvořený po použití algoritmu ML) a RDD má obrovskou velikost a dostupná vyrovnávací paměť v pracovním uzlu je menší, takže nemůžeme RDD uložit do vyrovnávací paměti. V tomto případě můžeme RDD uložit na DISK.

možná se divíte, jaký je smysl ukládání na Disk?

rozhodně, pokud uložíme RDD na Disk, dojde k I/O, což je časově náročné. Musíme však zajistit, aby I/O trvalo dlouhou dobu nebo přepočítání RDD trvalo déle. Nyní, pokud zjistíme, že I / O trvá méně času než přepočítání RDD, pak je v tomto případě lepší uložit RDD na Disk.

takže kdykoli je vyžadováno RDD1 příště v následné transformaci, Spark provede I / O operaci a přivede ji do paměti exekutora.

RDD1.persist(StorageLevel.DISK_ONLY)

– MEMORY_AND_DISK-řekněme, že mám v paměti exekutora 3 RDDs (žádné nejsou uloženy v mezipaměti) a není k dispozici žádná paměť. Mezitím přichází další RDD (řekněme RDD4). Spark tedy odstraní nejméně Nedávno použité (LRU) RDD z paměti exekutora a vytvoří prostor pro vstup nového RDD (v tomto případě RDD4).

nyní předpokládejme, že 3 RDD jsou ukládány do paměti a když dorazí RDD4, LRU nevykopne Žádný RDD z vyrovnávací paměti pracovního uzlu. A mohou existovat problémy s OOM.

ale pokud použijeme úroveň persistence MEMORY_AND_DISK s RDD4, RDD4 bude uložen na disku, pokud nenajde dostatek místa v mezipaměti.

RDD4.persist(StorageLevel.MEMORY_AND_DISK)

také, pokud je v paměti uloženo obrovské RDD a není dostatek vyrovnávací paměti, zbývající oddíly, které se nemohou vejít do vyrovnávací paměti, se rozlévají na Disk, pokud použijeme MEMORY_AND_DISK.

opět výzvou jsou I / o operace.

Poznámka: data přetrvávající na disku jsou uložena v umístění tmp.

formát paměti

serializace-můžeme zvolit serializaci dat uložených v mezipaměti.

MEMORY_ONLY_SER a MEMORY_AND_DISK_SER

přetrvávající RDD v serializované (binární) formě pomáhá zmenšit velikost RDD, čímž se vytvoří prostor pro další RDD, které mají být přetrvává v mezipaměti. Takže tyto dva formáty paměti jsou prostorově efektivní.

ale problém s tím je, že jsou méně časově efektivní, protože musíme vynaložit náklady na čas potřebný k deserializaci dat.

takže je to volba vývojáře, zda záleží na výkonu nebo na úložišti. Určitě by dopad na výkon nebyl velký,ale byl by to minutový.

replikace oddílů

ukládá oddíl na dva uzly.

DISK_ONLY_2
MEMORY_AND_DISK_2
MEMORY_ONLY_2
MEMORY_AND_DISK_SER_2
MEMORY_ONLY_SER_2

tyto možnosti ukládají replikovanou kopii RDD také do vyrovnávací paměti jiného pracovníka.

replikovaná data na disku budou použita k obnovení oddílu, tj. pomáhá přepočítat RDD, pokud druhý pracovní uzel klesá.

Unpersisting RDD

– Chcete-li zastavit přetrvávající a odstranit z paměti nebo disku
– Chcete-li změnit úroveň vytrvalosti RDD
rdd.unpersist ()

tak, jak můžeme pracovat s naší vyrovnávací pamětí v Apache Spark.

to je vše z tohoto blogu, doufám, že se vám to líbilo a pomohlo vám to!! Zůstaňte ve spojení pro další budoucí Blogy. Děkuji!!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.