Was ist der Unterschied zwischen Cache und Persist?

Antworten:

222

Mit verwenden cache()Sie nur die Standardspeicherebene:

  • MEMORY_ONLYfür RDD
  • MEMORY_AND_DISKfür Datensatz

Mit persist()können Sie angeben, welche Speicherebene für RDD und Dataset gewünscht wird .

Aus den offiziellen Dokumenten:

  • Sie können eine RDDzu persistierende Methode mit den Methoden persist() oder cache() markieren .
  • Jeder persistierte RDDkann mit einem anderen gespeichert werdenstorage level
  • Die cache() -Methode ist eine Abkürzung für die Verwendung der Standardspeicherebene StorageLevel.MEMORY_ONLY(Speichern deserialisierter Objekte im Speicher).

Verwenden persist()Sie diese Option, wenn Sie eine andere Speicherebene zuweisen möchten als:

  • MEMORY_ONLYan die RDD
  • oder MEMORY_AND_DISKfür Datensatz

Interessanter Link für die offizielle Dokumentation: Welche Speicherebene soll gewählt werden?

Ahars
quelle
17
Beachten Sie, dass cache()jetzt MEMORY_AND_DISK
ximiki
Ich denke nicht, dass der obige Kommentar richtig ist. Das Lesen der neuesten offiziellen Dokumentation unter Verwendung des Links ahars ermöglicht die Ausrichtung auf den letzten Aufzählungspunkt ... Die Methode cache () ist eine Abkürzung für die Verwendung der Standardspeicherebene StorageLevel.MEMORY_ONLY (Speichern deserialisierter Objekte im Speicher).
user2596560
1
@ximiki MEMORY_AND_DISKist der Standardwert nur für Datensätze. MEMORY_ONLYist immer noch der Standardwert für RDD
ahars
1
@ user2596560 Der Kommentar ist für den Standard-Cache-Wert der Datasets korrekt. Sie sind richtig für die RDD, die immer noch den Standardwert
MEMORY_ONLY
83

Der Unterschied zwischen cacheund persistOperationen ist rein syntaktisch. Cache ist ein Synonym für persist oder persist ( MEMORY_ONLY), dh cachenur persistmit 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 RDDwerden daher im Speicher (Standard) oder in einem festeren Speicher wie einer Festplatte gespeichert und / oder repliziert. RDDs kann mit cacheoperation zwischengespeichert werden . Sie können auch während des persistBetriebs 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 Varianten persist() und cache() sind nur Abkürzungen für persist(StorageLevel.MEMORY_ONLY).

Warnung : Sobald die Speicherebene geändert wurde, kann sie nicht mehr geändert werden!

Warnung -Cache mit Bedacht ... siehe ( (Warum) müssen wir den Cache aufrufen oder auf einer RDD bestehen bleiben )

Nur weil Sie einen RDDim 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)

Bild hier eingeben

Hinweis: Aufgrund des sehr kleinen und rein syntaktischen Unterschieds zwischen Caching und Persistenz von RDDs werden die beiden Begriffe häufig synonym verwendet.

Sehen Sie hier mehr visuell ....

Behalten Sie Speicher und Festplatte bei:

Geben Sie hier die Bildbeschreibung ein

Zwischenspeicher

Durch das Zwischenspeichern kann die Leistung Ihrer Anwendung erheblich verbessert werden.

Geben Sie hier die Bildbeschreibung ein

Ram Ghadiyaram
quelle
Ich habe einen DF in einem Block. Wie kann ich darauf zugreifen?
Bindumalini KK
48

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()
Mike Park
quelle
23

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.

Ketankk
quelle
4

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).

user11332824
quelle