Odpowiedzi:
Dzięki cache()
używasz tylko domyślnego poziomu pamięci:
MEMORY_ONLY
dla RDDMEMORY_AND_DISK
dla 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ć,
RDD
aby utrwalono, korzystając z metodpersist
() lubcache
().- każda utrwalona
RDD
moż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_ONLY
do RDDMEMORY_AND_DISK
dla zestawu danychCiekawy link do oficjalnej dokumentacji: jaki poziom pamięci wybrać
MEMORY_AND_DISK
jest wartością domyślną tylko dla zestawów danych. MEMORY_ONLY
jest nadal wartością domyślną dla RDD
Różnica pomiędzy
cache
ipersist
operacje czysto syntaktyczne. pamięć podręczna jest synonimem persist lub persist (MEMORY_ONLY
), tzn.cache
ma jedyniepersist
domyś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 RDD
s są zatem przechowywane w pamięci (domyślnie) lub w większej pamięci masowej, takiej jak dysk i / lub replikowane.
RDD
s mogą być buforowane przy użyciu cache
operacji. Można je również utrwalić za pomocą persist
operacji.
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 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ć RDD
pamięć, 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ą RDD
s 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_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.
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