Respuestas:
Con cache()
, solo usa el nivel de almacenamiento predeterminado:
MEMORY_ONLY
para RDDMEMORY_AND_DISK
para conjunto de datosCon persist()
, puede especificar qué nivel de almacenamiento desea para RDD y Dataset .
De los documentos oficiales:
- Puede marcar un
RDD
persistente utilizando los métodospersist
() ocache
() en él.- cada persistente
RDD
se puede almacenar usando un diferentestorage level
- El
cache
método () es una abreviatura para usar el nivel de almacenamiento predeterminado, que esStorageLevel.MEMORY_ONLY
(almacenar objetos deserializados en la memoria).
Úselo persist()
si desea asignar un nivel de almacenamiento que no sea:
MEMORY_ONLY
al RDDMEMORY_AND_DISK
para el conjunto de datosEnlace interesante para la documentación oficial: qué nivel de almacenamiento elegir
MEMORY_AND_DISK
es el valor predeterminado solo para conjuntos de datos. MEMORY_ONLY
sigue siendo el valor predeterminado para RDD
La diferencia entre
cache
ypersist
operaciones es puramente sintáctica. caché es sinónimo de persistir o persistir (MEMORY_ONLY
),cache
es decir, 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 intermedios 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
s se puede almacenar en caché mediante la cache
operación. También pueden persistirse mediante la persist
operació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 variantespersist
() ycache
() son solo abreviaturas parapersist(StorageLevel.MEMORY_ONLY).
Advertencia : una vez que se ha cambiado el nivel de almacenamiento, ¡no se puede volver a cambiar!
El hecho de que pueda almacenar RDD
en 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)
Nota: Debido a la diferencia muy pequeña y puramente sintáctica entre el almacenamiento en caché y la persistencia de RDD
s, los dos términos a menudo se usan indistintamente.
Ver más visualmente aquí ...
Persistir en memoria y disco:
El almacenamiento en caché puede mejorar el rendimiento de su aplicación en gran medida.
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.
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).
cache()
ahora usa MEMORY_AND_DISK