Antworten:
Mit verwenden cache()
Sie nur die Standardspeicherebene:
MEMORY_ONLY
für RDDMEMORY_AND_DISK
für DatensatzMit persist()
können Sie angeben, welche Speicherebene für RDD und Dataset gewünscht wird .
Aus den offiziellen Dokumenten:
- Sie können eine
RDD
zu persistierende Methode mit den Methodenpersist
() odercache
() markieren .- Jeder persistierte
RDD
kann mit einem anderen gespeichert werdenstorage level
- Die
cache
() -Methode ist eine Abkürzung für die Verwendung der StandardspeicherebeneStorageLevel.MEMORY_ONLY
(Speichern deserialisierter Objekte im Speicher).
Verwenden persist()
Sie diese Option, wenn Sie eine andere Speicherebene zuweisen möchten als:
MEMORY_ONLY
an die RDDMEMORY_AND_DISK
für DatensatzInteressanter Link für die offizielle Dokumentation: Welche Speicherebene soll gewählt werden?
MEMORY_AND_DISK
ist der Standardwert nur für Datensätze. MEMORY_ONLY
ist immer noch der Standardwert für RDD
Der Unterschied zwischen
cache
undpersist
Operationen ist rein syntaktisch. Cache ist ein Synonym für persist oder persist (MEMORY_ONLY
), dhcache
nurpersist
mit der StandardspeicherebeneMEMORY_ONLY
/ ** * Behalten Sie diese RDD mit der Standardspeicherebene (
MEMORY_ONLY
) bei. * /
def persist (): this.type = persist (StorageLevel.MEMORY_ONLY)/ ** * Behalten Sie diese RDD mit der Standardspeicherebene (
MEMORY_ONLY
) bei. * /
def cache (): this.type = persist ()
Weitere Details finden Sie hier ...
Caching oder Persistenz sind Optimierungstechniken für (iterative und interaktive) Spark-Berechnungen. Sie helfen dabei, Zwischenergebnisse zu speichern, damit sie in späteren Phasen wiederverwendet werden können. Diese Zwischenergebnisse RDD
werden daher im Speicher (Standard) oder in einem festeren Speicher wie einer Festplatte gespeichert und / oder repliziert.
RDD
s kann mit cache
operation zwischengespeichert werden . Sie können auch während des persist
Betriebs beibehalten werden .
persist
,cache
Diese Funktionen können verwendet werden, um die Speicherebene von a anzupassen
RDD
. Beim Freigeben von Speicher entscheidet Spark anhand der Speicherkennung, welche Partitionen beibehalten werden sollen. Die parameterlosen Variantenpersist
() undcache
() sind nur Abkürzungen fürpersist(StorageLevel.MEMORY_ONLY).
Warnung : Sobald die Speicherebene geändert wurde, kann sie nicht mehr geändert werden!
Nur weil Sie einen RDD
im Speicher zwischenspeichern können, heißt das nicht, dass Sie dies blind tun sollten. Abhängig davon, wie oft auf das Dataset zugegriffen wird und wie viel Arbeit damit verbunden ist, kann die Neuberechnung schneller sein als der Preis, der durch den erhöhten Speicherdruck gezahlt wird.
Es versteht sich von selbst, dass wenn Sie einen Datensatz nur dann lesen, wenn es keinen Sinn macht, ihn zwischenzuspeichern, dies Ihre Arbeit tatsächlich verlangsamt. Die Größe der zwischengespeicherten Datensätze kann der Spark-Shell entnommen werden.
Varianten auflisten ...
def cache(): RDD[T]
def persist(): RDD[T]
def persist(newLevel: StorageLevel): RDD[T]
* Siehe Beispiel unten: *
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)
Hinweis: Aufgrund des sehr kleinen und rein syntaktischen Unterschieds zwischen Caching und Persistenz von RDD
s werden die beiden Begriffe häufig synonym verwendet.
Sehen Sie hier mehr visuell ....
Behalten Sie Speicher und Festplatte bei:
Durch das Zwischenspeichern kann die Leistung Ihrer Anwendung erheblich verbessert werden.
Es gibt keinen Unterschied. Von 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()
Spark bietet 5 Arten von Speicherebenen
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
DISK_ONLY
cache()
wird verwenden MEMORY_ONLY
. Wenn Sie etwas anderes verwenden möchten, verwenden Sie persist(StorageLevel.<*type*>)
.
Standardmäßig persist()
werden die Daten im JVM-Heap als unserialisierte Objekte gespeichert.
Cache () und persist () werden beide Methoden verwendet, um die Leistung der Funkenberechnung zu verbessern. Diese Methoden helfen, Zwischenergebnisse zu speichern, damit sie in nachfolgenden Schritten wiederverwendet werden können.
Der einzige Unterschied zwischen cache () und persist () besteht darin, dass wir mit der Cache-Technik Zwischenergebnisse nur bei Bedarf im Speicher speichern können, während wir in Persist () die Zwischenergebnisse in 5 Speicherebenen speichern können (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY).
cache()
jetzt MEMORY_AND_DISK