Je suis une application spark avec plusieurs points sur lesquels je voudrais conserver l'état actuel. C’est généralement après une étape importante ou la mise en cache d’un état que j’aimerais utiliser plusieurs fois. Il semble que lorsque j'appelle une seconde fois le cache sur mon cadre de données, une nouvelle copie est mise en cache dans la mémoire. Dans mon application, cela entraîne des problèmes de mémoire lors de la mise à l'échelle. Même si, dans mes tests actuels, une trame de données donnée représente au maximum environ 100 Mo, la taille cumulée des résultats intermédiaires dépasse la mémoire allouée sur l'exécuteur. Voir ci-dessous un petit exemple illustrant ce comportement.
cache_test.py:
from pyspark import SparkContext, HiveContext
spark_context = SparkContext(appName='cache_test')
Hive_context = HiveContext(spark_context)
df = (Hive_context.read
.format('com.databricks.spark.csv')
.load('simple_data.csv')
)
df.cache()
df.show()
df = df.withColumn('C1+C2', df['C1'] + df['C2'])
df.cache()
df.show()
spark_context.stop()
simple_data.csv:
1,2,3
4,5,6
7,8,9
En regardant l'interface utilisateur de l'application, il existe une copie du cadre de données d'origine, en plus de celle avec la nouvelle colonne. Je peux supprimer l'original en appelant df.unpersist()
avant la ligne withColumn. Est-ce la méthode recommandée pour supprimer le résultat intermédiaire mis en cache (c.-à-d., Appelez unpersist avant chaque cache()
).
En outre, est-il possible de purger tous les objets mis en cache. Dans mon application, il existe des points d'arrêt naturels sur lesquels je peux simplement purger toute la mémoire et passer au fichier suivant. Je voudrais faire ceci sans créer une nouvelle application d'allumage pour chaque fichier d'entrée.
Merci d'avance!
Spark 2.x
Vous pouvez utiliser Catalog.clearCache
:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate
...
spark.catalog.clearCache()
Spark 1.x
Vous pouvez utiliser SQLContext.clearCache
méthode qui
Supprime toutes les tables mises en cache du cache en mémoire.
from pyspark.sql import SQLContext
from pyspark import SparkContext
sqlContext = SQLContext.getOrCreate(SparkContext.getOrCreate())
...
sqlContext.clearCache()
Nous l'utilisons assez souvent
for (id, rdd) in sc._jsc.getPersistentRDDs().items():
rdd.unpersist()
print("Unpersisted {} rdd".format(id))
où sc
est une variable sparkContext.
peut individuellement annuler tous les df:
firstDF.unpersist()
secondDF.unpersist()