¿Cuál es la diferencia entre cache y persistir?

Respuestas:

222

Con cache(), solo usa el nivel de almacenamiento predeterminado:

  • MEMORY_ONLYpara RDD
  • MEMORY_AND_DISKpara conjunto de datos

Con persist(), puede especificar qué nivel de almacenamiento desea para RDD y Dataset .

De los documentos oficiales:

  • Puede marcar un RDDpersistente utilizando los métodos persist() o cache() en él.
  • cada persistente RDDse puede almacenar usando un diferentestorage level
  • El cachemétodo () es una abreviatura para usar el nivel de almacenamiento predeterminado, que es StorageLevel.MEMORY_ONLY(almacenar objetos deserializados en la memoria).

Úselo persist()si desea asignar un nivel de almacenamiento que no sea:

  • MEMORY_ONLYal RDD
  • o MEMORY_AND_DISKpara el conjunto de datos

Enlace interesante para la documentación oficial: qué nivel de almacenamiento elegir

ahars
fuente
17
Tenga en cuenta que cache()ahora usa MEMORY_AND_DISK
ximiki
No creo que el comentario anterior sea correcto. Al leer la documentación oficial más reciente, usar el enlace ahars proporciona alineaciones con el último punto de viñeta ... El método cache () es una abreviatura para usar el nivel de almacenamiento predeterminado, que es StorageLevel.MEMORY_ONLY (almacenar objetos deserializados en la memoria).
user2596560
1
@ximiki, MEMORY_AND_DISKes el valor predeterminado solo para conjuntos de datos. MEMORY_ONLYsigue siendo el valor predeterminado para RDD
ahars
1
@ user2596560 el comentario es correcto para el valor de caché predeterminado de los conjuntos de datos. Tiene razón para el RDD que aún mantiene el valor predeterminado de
MEMORY_ONLY
83

La diferencia entre cachey persistoperaciones es puramente sintáctica. caché es sinónimo de persistir o persistir ( MEMORY_ONLY), cachees decir, es simplemente persistcon el nivel de almacenamiento predeterminadoMEMORY_ONLY


/ ** * Persiste este RDD con el nivel de almacenamiento predeterminado ( MEMORY_ONLY). * /
def persist (): this.type = persist (StorageLevel.MEMORY_ONLY)

/ ** * Persiste este RDD con el nivel de almacenamiento predeterminado ( MEMORY_ONLY). * /
def cache (): this.type = persist ()

ver más detalles aquí ...


El almacenamiento en caché o la persistencia son técnicas de optimización para los cálculos de Spark (iterativos e interactivos). Ayudan a guardar resultados parciales intermedios para que puedan reutilizarse en etapas posteriores. Estos resultados intermedios como RDDs se mantienen en la memoria (por defecto) o en un almacenamiento más sólido como el disco y / o se replican. RDDs se puede almacenar en caché mediante la cacheoperación. También pueden persistirse mediante la persistoperación.

persist, cache

Estas funciones se pueden usar para ajustar el nivel de almacenamiento de a RDD. Al liberar memoria, Spark usará el identificador de nivel de almacenamiento para decidir qué particiones se deben mantener. El parámetro menos variantes persist() y cache() son solo abreviaturas para persist(StorageLevel.MEMORY_ONLY).

Advertencia : una vez que se ha cambiado el nivel de almacenamiento, ¡no se puede volver a cambiar!

Advertencia -Cache juiciosamente ... vea ( (¿Por qué?) Necesitamos llamar al caché o persistir en un RDD )

El hecho de que pueda almacenar RDDen caché un archivo en la memoria no significa que deba hacerlo a ciegas. Dependiendo de cuántas veces se acceda al conjunto de datos y la cantidad de trabajo involucrado en hacerlo, la recalculación puede ser más rápida que el precio pagado por el aumento de la presión de la memoria.

No hace falta decir que si solo lee un conjunto de datos una vez que no tiene sentido almacenarlo en caché, en realidad hará que su trabajo sea más lento. El tamaño de los conjuntos de datos en caché se puede ver desde Spark Shell.

Listado de variantes ...

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

* Ver ejemplo a continuación: *

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)

ingrese la imagen aquí

Nota: Debido a la diferencia muy pequeña y puramente sintáctica entre el almacenamiento en caché y la persistencia de RDDs, los dos términos a menudo se usan indistintamente.

Ver más visualmente aquí ...

Persistir en memoria y disco:

ingrese la descripción de la imagen aquí

Cache

El almacenamiento en caché puede mejorar el rendimiento de su aplicación en gran medida.

ingrese la descripción de la imagen aquí

Ram Ghadiyaram
fuente
Tengo un DF dentro de un bloque. ¿Cómo puedo acceder?
Bindumalini KK
48

No hay diferencia. De 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
fuente
23

Spark ofrece 5 tipos de nivel de almacenamiento

  • MEMORY_ONLY
  • MEMORY_ONLY_SER
  • MEMORY_AND_DISK
  • MEMORY_AND_DISK_SER
  • DISK_ONLY

cache()utilizará MEMORY_ONLY. Si quieres usar otra cosa, úsala persist(StorageLevel.<*type*>).

De forma predeterminada persist(), almacenará los datos en el montón JVM como objetos no serializados.

ketankk
fuente
4

Cache () y persistir () ambos métodos se utilizan para mejorar el rendimiento del cálculo de chispa. Estos métodos ayudan a guardar resultados intermedios para que puedan reutilizarse en etapas posteriores.

La única diferencia entre cache () y persist () es que, utilizando la técnica de caché, podemos guardar resultados intermedios en la memoria solo cuando sea necesario, mientras que en Persist () podemos guardar los resultados intermedios en 5 niveles de almacenamiento (MEMORY_ONLY, MEMORY_AND_DISK, MEMORY_ONLY_SER, MEMORY_AND_DISK_SER, DISK_ONLY).

usuario11332824
fuente