Respuestas:
Con cache(), solo usa el nivel de almacenamiento predeterminado:
MEMORY_ONLYpara RDDMEMORY_AND_DISKpara conjunto de datosCon persist(), puede especificar qué nivel de almacenamiento desea para RDD y Dataset .
De los documentos oficiales:
- Puede marcar un
RDDpersistente utilizando los métodospersist() ocache() 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 esStorageLevel.MEMORY_ONLY(almacenar objetos deserializados en la memoria).
Úselo persist()si desea asignar un nivel de almacenamiento que no sea:
MEMORY_ONLYal RDDMEMORY_AND_DISKpara el conjunto de datosEnlace interesante para la documentación oficial: qué nivel de almacenamiento elegir
MEMORY_AND_DISKes el valor predeterminado solo para conjuntos de datos. MEMORY_ONLYsigue siendo el valor predeterminado para RDD
La diferencia entre
cacheypersistoperaciones es puramente sintáctica. caché es sinónimo de persistir o persistir (MEMORY_ONLY),cachees decir, es simplementepersistcon 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,cacheEstas 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 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)
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:
El almacenamiento en caché puede mejorar el rendimiento de su aplicación en gran medida.
Spark ofrece 5 tipos de nivel de almacenamiento
MEMORY_ONLYMEMORY_ONLY_SERMEMORY_AND_DISKMEMORY_AND_DISK_SERDISK_ONLYcache()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