bja*_*ck3 26 python caching apache-spark apache-spark-sql pyspark
我是一个火花应用程序,有几点我想坚持当前的状态.这通常是在一大步之后,或缓存我想要多次使用的状态.看来,当我第二次在我的数据帧上调用缓存时,新副本会缓存到内存中.在我的应用程序中,这会在扩展时导致内存问题.即使在我当前的测试中,给定的数据帧最大约为100 MB,中间结果的累积大小也会超出执行程序的分配内存.请参阅下面的一个显示此行为的小示例.
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()
Run Code Online (Sandbox Code Playgroud)
simple_data.csv:
1,2,3
4,5,6
7,8,9
Run Code Online (Sandbox Code Playgroud)
查看应用程序UI,有一个原始数据框的副本,与新列的副本相对应.我可以通过df.unpersist()
在withColumn行之前调用来删除原始副本.这是删除缓存中间结果的推荐方法(即在每次调用之前调用unpersist cache()
).
此外,是否可以清除所有缓存的对象.在我的应用程序中,有一些自然断点,我可以简单地清除所有内存,然后转到下一个文件.我想这样做而不为每个输入文件创建一个新的spark应用程序.
先感谢您!
zer*_*323 41
Spark 2.x
你可以使用Catalog.clearCache
:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate
...
spark.catalog.clearCache()
Run Code Online (Sandbox Code Playgroud)
Spark 1.x
你可以使用SQLContext.clearCache
哪种方法
从内存缓存中删除所有缓存的表.
from pyspark.sql import SQLContext
from pyspark import SparkContext
sqlContext = SQLContext.getOrCreate(SparkContext.getOrCreate())
...
sqlContext.clearCache()
Run Code Online (Sandbox Code Playgroud)
我们经常使用
for (id, rdd) in sc._jsc.getPersistentRDDs().items():
rdd.unpersist()
print("Unpersisted {} rdd".format(id))
Run Code Online (Sandbox Code Playgroud)
哪里sc
是sparkContext变量。
归档时间: |
|
查看次数: |
28241 次 |
最近记录: |