Nous utilisons .cache()
sur RDD pour la mise en cache persistante d'un ensemble de données, ma préoccupation est quand cette mise en cache expirera?.
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
la source
Nous utilisons .cache()
sur RDD pour la mise en cache persistante d'un ensemble de données, ma préoccupation est quand cette mise en cache expirera?.
dt = sc.parallelize([2, 3, 4, 5, 6])
dt.cache()
Il n'expirera pas tant que Spark n'aura plus de mémoire, auquel cas il supprimera les RDD du cache les moins utilisés. Lorsque vous demandez quelque chose qui n'a pas été mis en cache, il recalcule le pipeline et le remet en cache. Si ce serait trop cher, dissipez les autres RDD, ne les mettez pas en cache en premier lieu ou ne les conservez pas sur votre système de fichiers.
En plus de la réponse de Jan, je voudrais souligner que le stockage RDD sérialisé (/ mise en cache) fonctionne beaucoup mieux que la mise en cache RDD normale pour les grands ensembles de données .
Il permet également d'optimiser la collecte des ordures, en cas de grands ensembles de données.
De plus, à partir des documents spark:
Lorsque vos objets sont encore trop volumineux pour être stockés efficacement malgré ce réglage, un moyen beaucoup plus simple de réduire l'utilisation de la mémoire consiste à les stocker sous forme sérialisée, en utilisant les StorageLevels sérialisés dans l'API de persistance RDD, tels que MEMORY_ONLY_SER. Spark stocke ensuite chaque partition RDD dans un grand tableau d'octets. Le seul inconvénient du stockage des données sous forme sérialisée est le temps d'accès plus lent, car il faut désérialiser chaque objet à la volée. Nous vous recommandons fortement d'utiliser Kryo si vous souhaitez mettre en cache des données sous forme sérialisée, car cela conduit à des tailles beaucoup plus petites que la sérialisation Java (et certainement que les objets Java bruts).
MEMORY_ONLY_SER
n'est disponible qu'en Scala / Java, pas en Python.Spark supprime / nettoie automatiquement le RDD ou le Dataframe si le RDD n'est plus utilisé. Pour vérifier si un RDD est mis en cache, veuillez vérifier dans l'interface utilisateur Spark et vérifiez l'onglet Stockage et examinez les détails de la mémoire.
Depuis le terminal, vous pouvez utiliser
rdd.unpersist()
ousqlContext.uncacheTable("sparktable")
pour supprimer le RDD ou les tables de la mémoire. Spark fait pour l'évaluation paresseuse, sauf si et jusqu'à ce que vous disiez une action, il ne charge ni ne traite aucune donnée dans le RDD ou DataFrame.la source