Jaka jest różnica między pamięcią podręczną a trwałością?

Odpowiedzi:

222

Dzięki cache()używasz tylko domyślnego poziomu pamięci:

  • MEMORY_ONLYdla RDD
  • MEMORY_AND_DISKdla zestawu danych

Za pomocą persist()możesz określić, który poziom pamięci chcesz mieć zarówno dla RDD, jak i zestawu danych .

Z oficjalnych dokumentów:

  • Możesz oznaczyć, RDDaby utrwalono, korzystając z metod persist() lub cache().
  • każda utrwalona RDDmoże być przechowywana przy użyciu innejstorage level
  • Metoda cache() jest skrótem do używania domyślnego poziomu pamięci, którym jest StorageLevel.MEMORY_ONLY(przechowuj zdezrializowane obiekty w pamięci).

Użyj, persist()jeśli chcesz przypisać poziom pamięci inny niż:

  • MEMORY_ONLYdo RDD
  • lub MEMORY_AND_DISKdla zestawu danych

Ciekawy link do oficjalnej dokumentacji: jaki poziom pamięci wybrać

ahars
źródło
17
Zauważ, że cache()teraz używa MEMORY_AND_DISK
ximiki
Nie sądzę, aby powyższy komentarz był poprawny. Czytanie najnowszej oficjalnej dokumentacji, korzystanie z łącza ahars zapewnia wyrównanie do ostatniego punktu wypunktowania ... Metoda cache () jest skrótem do korzystania z domyślnego poziomu pamięci, jakim jest StorageLevel.MEMORY_ONLY (przechowuj zdezrializowane obiekty w pamięci).
user2596560
1
@ximiki, MEMORY_AND_DISKjest wartością domyślną tylko dla zestawów danych. MEMORY_ONLYjest nadal wartością domyślną dla RDD
ahars
1
@ user2596560 komentarz jest poprawny dla domyślnej wartości pamięci podręcznej zestawów danych. Masz rację dla RDD, która nadal utrzymuje domyślną wartość
MEMORY_ONLY
83

Różnica pomiędzy cachei persistoperacje czysto syntaktyczne. pamięć podręczna jest synonimem persist lub persist ( MEMORY_ONLY), tzn. cachema jedynie persistdomyślny poziom pamięciMEMORY_ONLY


/ ** * Utrzymaj ten RDD z domyślnym poziomem pamięci ( MEMORY_ONLY). * /
def persist (): this.type = persist (StorageLevel.MEMORY_ONLY)

/ ** * Utrzymaj ten RDD z domyślnym poziomem pamięci ( MEMORY_ONLY). * /
def cache (): this.type = persist ()

zobacz więcej szczegółów tutaj ...


Buforowanie lub trwałość to techniki optymalizacji obliczeń (iteracyjnych i interaktywnych) Spark. Pomagają one zachować tymczasowe wyniki częściowe, aby można je było ponownie wykorzystać w kolejnych etapach. Tymczasowe wyniki jako RDDs są zatem przechowywane w pamięci (domyślnie) lub w większej pamięci masowej, takiej jak dysk i / lub replikowane. RDDs mogą być buforowane przy użyciu cacheoperacji. Można je również utrwalić za pomocą persistoperacji.

persist, cache

Tych funkcji można użyć do dostosowania poziomu pamięci RDD. Podczas zwalniania pamięci Spark użyje identyfikatora poziomu pamięci, aby zdecydować, które partycje należy zachować. Parametr less options persist() i cache() to tylko skróty persist(StorageLevel.MEMORY_ONLY).

Ostrzeżenie : po zmianie poziomu pamięci nie można go zmienić!

Ostrzeżenie - rozsądnie buforuj ... zobacz ( (Dlaczego) musimy wywoływać pamięć podręczną lub utrzymywać na RDD )

To, że możesz buforować RDDpamięć, nie oznacza, że ​​powinieneś ślepo to robić. W zależności od tego, ile razy dostęp do zestawu danych jest uzyskiwany, oraz nakład pracy związany z tym, ponowne obliczenia mogą być szybsze niż cena płacona za zwiększoną presję pamięci.

Oczywiste jest, że jeśli czytasz zestaw danych tylko wtedy, gdy nie ma sensu buforować go, spowoduje to spowolnienie pracy. Rozmiar buforowanych zestawów danych można zobaczyć w Spark Shell.

Lista wariantów ...

def cache(): RDD[T]
 def persist(): RDD[T]
 def persist(newLevel: StorageLevel): RDD[T]

* Zobacz poniższy przykład: *

val c = sc.parallelize(List("Gnu", "Cat", "Rat", "Dog", "Gnu", "Rat"), 2)
     c.getStorageLevel
     res0: org.apache.spark.storage.StorageLevel = StorageLevel(false, false, false, false, 1)
     c.cache
     c.getStorageLevel
     res2: org.apache.spark.storage.StorageLevel = StorageLevel(false, true, false, true, 1)

wpisz obraz tutaj

Uwaga: Ze względu na bardzo małą i czysto syntaktyczną różnicę między buforowaniem a trwałością RDDs oba te terminy są często używane zamiennie.

Zobacz więcej wizualnie tutaj ....

Trwaj w pamięci i na dysku:

wprowadź opis zdjęcia tutaj

Pamięć podręczna

Buforowanie może znacznie poprawić wydajność aplikacji.

wprowadź opis zdjęcia tutaj

Ram Ghadiyaram
źródło
Mam DF wewnątrz bloku, jak mogę uzyskać do niego dostęp.
Bindumalini KK,
48

Nie ma różnicy. Od RDD.scala.

/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)

/** Persist this RDD with the default storage level (`MEMORY_ONLY`). */
def cache(): this.type = persist()
Mike Park
źródło
23

Spark daje 5 rodzajów poziomu pamięci

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache()użyje MEMORY_ONLY. Jeśli chcesz użyć czegoś innego, użyj persist(StorageLevel.<*type*>).

Domyślnie dane persist()będą przechowywane na stosie JVM jako niezserializowane obiekty.

ketankk
źródło
4

Obie metody Cache () i persist () służą do poprawy wydajności obliczania iskier. Te metody pomagają zapisać wyniki pośrednie, dzięki czemu można je ponownie wykorzystać w kolejnych etapach.

Jedyna różnica między cache () i persist () polega na tym, że za pomocą techniki Cache możemy zapisać wyniki pośrednie w pamięci tylko wtedy, gdy jest to potrzebne, natomiast w Persist () możemy zapisać wyniki pośrednie na 5 poziomach pamięci (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY).

użytkownik11332824
źródło