web-dev-qa-db-fra.com

Supprimer la persistance de toutes les images dans (pyspark

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!

13
bjack3

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()
23
zero323

Nous l'utilisons assez souvent

for (id, rdd) in sc._jsc.getPersistentRDDs().items():
    rdd.unpersist()
    print("Unpersisted {} rdd".format(id))

sc est une variable sparkContext.

4
Tagar

peut individuellement annuler tous les df:

firstDF.unpersist()
secondDF.unpersist()
0
Grant Shannon