Odpowiedzi:
Dzięki cache()używasz tylko domyślnego poziomu pamięci:
MEMORY_ONLYdla RDDMEMORY_AND_DISKdla zestawu danychZa 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 metodpersist() lubcache().- 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 jestStorageLevel.MEMORY_ONLY(przechowuj zdezrializowane obiekty w pamięci).
Użyj, persist()jeśli chcesz przypisać poziom pamięci inny niż:
MEMORY_ONLYdo RDDMEMORY_AND_DISKdla zestawu danychCiekawy link do oficjalnej dokumentacji: jaki poziom pamięci wybrać
MEMORY_AND_DISKjest wartością domyślną tylko dla zestawów danych. MEMORY_ONLYjest nadal wartością domyślną dla RDD
Różnica pomiędzy
cacheipersistoperacje czysto syntaktyczne. pamięć podręczna jest synonimem persist lub persist (MEMORY_ONLY), tzn.cachema jedyniepersistdomyś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,cacheTych 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 optionspersist() icache() to tylko skrótypersist(StorageLevel.MEMORY_ONLY).Ostrzeżenie : po zmianie poziomu pamięci nie można go zmienić!
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)
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:
Buforowanie może znacznie poprawić wydajność aplikacji.
Spark daje 5 rodzajów poziomu pamięci
MEMORY_ONLYMEMORY_ONLY_SERMEMORY_AND_DISKMEMORY_AND_DISK_SERDISK_ONLYcache()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.
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).
cache()teraz używa MEMORY_AND_DISK