私はspark現在の状態を維持したいいくつかのポイントがあるアプリケーションです。これは通常、大きなステップの後、または複数回使用したい状態をキャッシュします。データフレームでキャッシュを2回呼び出すと、新しいコピーがメモリにキャッシュされます。アプリケーションでは、スケールアップ時にメモリの問題が発生しますが、現在のテストでは、特定のデータフレームは最大約100 MBです。 、中間結果の累積サイズは、executorに割り当てられたメモリを超えて大きくなります。この動作を示す小さな例については、以下を参照してください。
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
_
アプリケーションUIを見ると、元のデータフレームのコピーと、新しい列のあるデータフレームがあります。 withColumn行の前にdf.unpersist()
を呼び出すことにより、元のコピーを削除できます。これは、キャッシュされた中間結果を削除するのに推奨される方法ですか(つまり、すべてのcache()
の前にunpersistを呼び出します)。
また、キャッシュされたすべてのオブジェクトをパージすることは可能ですか?私のアプリケーションには、すべてのメモリを単純にパージし、次のファイルに進むことができる自然なブレークポイントがあります。入力ファイルごとに新しいsparkアプリケーションを作成せずにこれを実行したいと思います。
前もって感謝します!
Spark 2.x
Catalog.clearCache
を使用できます:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate
...
spark.catalog.clearCache()
Spark 1.x
SQLContext.clearCache
メソッドを使用できます。
メモリ内キャッシュからすべてのキャッシュテーブルを削除します。
from pyspark.sql import SQLContext
from pyspark import SparkContext
sqlContext = SQLContext.getOrCreate(SparkContext.getOrCreate())
...
sqlContext.clearCache()
これはかなり頻繁に使用します
for (id, rdd) in sc._jsc.getPersistentRDDs().items():
rdd.unpersist()
print("Unpersisted {} rdd".format(id))
ここで、sc
はsparkContext変数です。
すべてのdfを個別に分散できます。
firstDF.unpersist()
secondDF.unpersist()