apache spark - started - ¿Cuál es la diferencia entre cache y persistir?
rdd spark (5)
La diferencia entre las operaciones de
cache
ypersist
es puramente sintáctica. caché es sinónimo de persistir o persistir (MEMORY_ONLY
), es decir,cache
es simplementepersist
con 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 provisionales como
RDD
s se mantienen en la memoria (por defecto) o en un almacenamiento más sólido como el disco y / o se replican.
RDD
se pueden almacenar en caché utilizando la operación de
cache
.
También pueden persistirse utilizando la operación de
persist
.
persist
,cache
Estas funciones se pueden usar para ajustar el nivel de almacenamiento de un
RDD
. Al liberar memoria, Spark usará el identificador de nivel de almacenamiento para decidir qué particiones se deben mantener. El parámetro menos variantespersist
() ycache
() son solo abreviaturas depersist(StorageLevel.MEMORY_ONLY).
Advertencia : una vez que se ha cambiado el nivel de almacenamiento, no se puede volver a cambiar.
Advertencia - Caché juiciosamente ... vea ( (¿Por qué?) Necesitamos llamar al caché o persistir en un RDD )
El hecho de que pueda almacenar en caché un
RDD
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)
Ver más visualmente aquí ...
Persistir en memoria y disco:
Cache
El almacenamiento en caché puede mejorar el rendimiento de su aplicación en gran medida.
En términos de persistencia de
RDD
, ¿cuáles son las diferencias entre
cache()
y
persist()
en spark?
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).
Con
cache()
, usa solo el nivel de almacenamiento predeterminado:
-
MEMORY_ONLY
para RDD -
MEMORY_AND_DISK
para el conjunto de datos
Con
persist()
, puede especificar qué nivel de almacenamiento desea para
RDD
y
Dataset
.
De los documentos oficiales:
- Puede marcar un
RDD
para que sea persistente utilizando los métodospersist
() ocache
() en él.- cada
RDD
persistente se puede almacenar usando unstorage level
diferente- El método
cache
() es una abreviatura para usar el nivel de almacenamiento predeterminado, que esStorageLevel.MEMORY_ONLY
(almacenar objetos deserializados en la memoria).
Use
persist()
si desea asignar un nivel de almacenamiento que no sea:
-
MEMORY_ONLY
al RDD -
o
MEMORY_AND_DISK
para el conjunto de datos
Enlace interesante para la documentación oficial: qué nivel de almacenamiento elegir
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()
Spark ofrece 5 tipos de nivel de almacenamiento
-
MEMORY_ONLY
-
MEMORY_ONLY_SER
-
MEMORY_AND_DISK
-
MEMORY_AND_DISK_SER
-
DISK_ONLY
cache()
usará
MEMORY_ONLY
.
Si desea usar otra cosa, use
persist(StorageLevel.<*type*>)
.
De forma predeterminada,
persist()
almacenará los datos en el montón JVM como objetos no serializados.