web-dev-qa-db-ja.com

(pysparkのすべてのデータフレームの非永続化

私は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アプリケーションを作成せずにこれを実行したいと思います。

前もって感謝します!

24
bjack3

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

これはかなり頻繁に使用します

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

ここで、scはsparkContext変数です。

6
Tagar

すべてのdfを個別に分散できます。

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