Usamos .cache()
en RDD para el almacenamiento en caché persistente de un conjunto de datos. Mi preocupación es cuándo expirará este almacenamiento en caché.
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
fuente
Usamos .cache()
en RDD para el almacenamiento en caché persistente de un conjunto de datos. Mi preocupación es cuándo expirará este almacenamiento en caché.
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
No caducará hasta que Spark se quede sin memoria, momento en el cual eliminará los RDD de la memoria caché que se usan con menos frecuencia. Cuando solicite algo que no se ha almacenado en caché, volverá a calcular la canalización y lo volverá a almacenar en caché. Si esto fuera demasiado costoso, elimine los otros RDD, no los almacene en caché ni los conserve en su sistema de archivos.
Además de la respuesta de Jan, me gustaría señalar que el almacenamiento RDD serializado (/ almacenamiento en caché) funciona mucho mejor que el almacenamiento en caché RDD normal para grandes conjuntos de datos .
También ayuda a optimizar la recolección de basura, en caso de grandes conjuntos de datos.
Además, de los documentos de chispa:
Cuando sus objetos aún son demasiado grandes para almacenarlos de manera eficiente a pesar de este ajuste, una forma mucho más simple de reducir el uso de memoria es almacenarlos en forma serializada, utilizando los StorageLevels serializados en la API de persistencia RDD, como MEMORY_ONLY_SER. Spark luego almacenará cada partición RDD como una matriz de bytes grande. El único inconveniente de almacenar datos en forma serializada es que los tiempos de acceso son más lentos, debido a la necesidad de deserializar cada objeto sobre la marcha. Recomendamos utilizar Kryo si desea almacenar en caché los datos en forma serializada, ya que conduce a tamaños mucho más pequeños que la serialización Java (y ciertamente que los objetos Java sin procesar).
MEMORY_ONLY_SER
solo está disponible en Scala / Java, no en Python.Spark automáticamente desistirá / limpiará el RDD o el Dataframe si el RDD ya no se usa. Para verificar si un RDD está en caché, ingrese a la interfaz de usuario de Spark y verifique la pestaña Almacenamiento y mire los detalles de la Memoria.
Desde el terminal, puede usar
rdd.unpersist()
osqlContext.uncacheTable("sparktable")
eliminar el RDD o las tablas de la memoria. Spark se realizó para la evaluación diferida, a menos que y hasta que diga alguna acción, no cargue ni procese ningún dato en el RDD o el DataFrame.fuente