spark持久化操作 persist(),cache()

本文探讨Spark中数据持久化的重要性,通过对比缓存与非缓存情况下的计数操作时间,展示persist()与cache()如何有效减少重复计算,提高效率。深入解析StorageLevel配置选项,帮助读者理解不同持久化策略的适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spark对同一个RDD执行多次算法的默认原理:每次对一个RDD执行一个算子操作时,都会重新从源头处计算一遍。如果某一部分的数据在程序中需要反复使用,这样会增加时间的消耗。

为了改善这个问题,spark提供了一个数据持久化的操作,我们可通过persist()或cache()将需要反复使用的数据加载在内存或硬盘当中,以备后用。

以下是一个基于pyspark计数的测试

#-*- encoding='utf-8' -*-
from pyspark.sql import SparkSession
import time
from pyspark import StorageLevel
spark = SparkSession \
        .builder \
        .appName('test') \
        .getOrCreate()

data = spark.read.csv("hdfs:///user/sparknode/input/test_repartition/*",header=True).cache()

t1 = time.time()
print(data.count())
t2 = time.time()
print(t2-t1)

print(data.count())
t3 = time.time()
print(t3-t2)

print(data.count())
t4 = time.time()
print(t4-t3)


#该输出结果为
29999990
108.410
29999990
6.730
29999990
1.391



#如果没加持久化操作cache(),结果为
29999990
37.553783655166626
29999990
38.87501883506775
29999990
38.92804193496704

从结果可以看出,

未加cache()时,每一次计数操作所用的时间都一样,是否可说明,spark在每一个action结束后都将数据释放了?然后,下次action需要再重新读取。

加cache()后,第二第三次计数所用的时间明显下降,但第一次计数所用的时间却比正常的多,这说明cache()操作本身需要消耗一定的时间,怎么权衡就看实际情况了。

 

persist()与cache()操作

我们可在读取数据或transform之后连续的调用perisist()或cache()进行数据持久化。

data = spark.read.csv("hdfs:///user/sparknode/input/test_repartition/*",header=True) \
.persist(storageLevel=StorageLevel(False,True,False,False,1))

持久化操作可以将数据加载在内存或硬盘中,也可以备份多份,减少数据丢失后重新计算的时间。

采用persist()时,需要先载入StorageLevel方法,该方法主要用于持久化策略的选择

from pyspark import StroageLevel


#参数
StorageLevel(useDisk, useMemory, useOffHeap, deserialized, replication=1)

useDisk     是否使用硬盘
useMemory   是否使用内存
replication 备份份数

#_ser是采用了序列化存储方式,从而减小持久化带来的内存消耗

DISK_ONLY = StorageLevel(True, False, False, False, 1)

DISK_ONLY_2 = StorageLevel(True, False, False, False, 2)

MEMORY_AND_DISK = StorageLevel(True, True, False, False, 1)

MEMORY_AND_DISK_2 = StorageLevel(True, True, False, False, 2)

MEMORY_AND_DISK_SER = StorageLevel(True, True, False, False, 1)

MEMORY_AND_DISK_SER_2 = StorageLevel(True, True, False, False, 2)

MEMORY_ONLY = StorageLevel(False, True, False, False, 1)

MEMORY_ONLY_2 = StorageLevel(False, True, False, False, 2)

MEMORY_ONLY_SER = StorageLevel(False, True, False, False, 1)

MEMORY_ONLY_SER_2 = StorageLevel(False, True, False, False, 2)

OFF_HEAP = StorageLevel(True, True, True, False, 1)

而cache()实际上是调用了persist()方法,并选择了持久化策略为 storageLevel=StorageLevel(True, True, False, False, 1)

即 .cache()与.persist(storageLevel=StorageLevel(True, True, False, False, 1))效果是一样的,都是MEMORY_AND_DISK持久化策略。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值