RDD之间进行相互迭代计算(Transformation的转换),当执行开启后,新RDD的生成,代表老RDD的消失。
RDD的数据是过程数据,只在处理的过程中存在,一旦处理完成,就不见了。
这个特性可以最大化的利用资源,老旧RDD没用了就从内存中清理,给后续的计算腾出内存空间。但是如果需要多次使用某一个RDD时,只能根据血统关系从头开始计算,这就会导致计算资源的浪费。
RDD的缓存技术: Spark提供了缓存APl,可以让我们通过调用API,将指定的RDD数据保留在内存或者硬盘上缓存的API
#RDD3被2次使用,可以加入缓存进行优化
rdd3.cache() #缓存到内存中.
rdd3.persist(StorageLevel.MENORY_ONLY) #仅内存缓存
rdd3.persist(storageLevel.MEMORY_ONLY_2) #仅内存缓存,2个副本
rdd3.persist(StorageLevel.DISK_ONLY) #仅缓存硬盘上
rdd3.persist(storageLevel.DISK_ONLY_2) #仅缓存硬盘上,2个副本
rdd3.persist(storageLevel.DISK_ONLY_3) #仅缓存硬盘上,3个副本
rdd3.persist(storageLevel.MENORY_AND_DISK) #先放内存,不够放硬盘
rdd3.persist(StorageLevel.MENORY_AND_DISK_2) #先放内存,不够放硬盘,2个副本rdd3.persist(storageLevel.OFF_HEAP) #堆外内存(系统内存)
#如上API,自行选择使用即可
#一般建议使用rdd3.persist(StorageLevel.MENORY_AND_DISK)
#如果内存比较小的集群,建议使用rdd3.persist(StorageLevel.DISK_ONLY)
#或者就别用缓存了 用CheckPoint
#主动清理缓存的API
rdd.unpersist()
缓存特点:缓存技术可以将过程RDD数据,持久化保存到内存或者硬盘上
但是,这个保存在设定上是认为不安全的.缓存的数据在设计上是认为有丢失风险的.所以,缓存有一个特点就是:其保留RDD之间的血缘(依赖)关系一旦缓存丢失,可以基于血缘关系的记录,重新计算这个RDD的数据。
缓存如何丢失:
1.在内存中的缓存是不安全的,比如断电\计算任务内存不足,把缓存清理给计算让路。
2.硬盘中因为硬盘损坏也是可能丢失的。
CheckPoint技术,也是将RDD的数据,保存起来.但是它仅支持硬盘存储
特点:
①它被设计认为是安全的
②不保留血缘关系
checkpoint示意图CheckPoint存储RDD数据,是集中收集各个分区数据进行存储。而缓存是分散存储。
#代码实现
#设置CheckPoint第一件事情,选择CP的保存路径
#如果是Local模式,可以支持本地文件系统,如果在集群运行,千万要用HDFS
sc.setcheckpointDir("hdfs:// node1:8020/output/bj52ckp")
#用的时候,直接调用checkpoint算子即可.
rdd.checkpoint()
①CheckPoint不管分区数量卡少,风险是一样的,缓存分区越多,风险越高。
②CheckPoint支持写入HDFS,缓存不行, HDFS是高可靠存储, CheckPoint被认为是安全的。
③CheckPoint不支持内存,缓存可以,缓存如果写内存性能比CheckPoint要好一些。
④CheckPoint因为设计认为是安全的,所以不保留血缘关系,而缓存因为设计上认为不安全,所以保留。
#cache代码示例
#cording:utf8
import time
from pyspark import SparkConf,SparkContext
if __name__ == '__main__':
conf = SparkConf().setMaster('local[*]').setAppName('test')
sc = SparkContext(conf=conf)
rdd1 = sc.textFile("../input/words.txt")
rdd2 = rdd1.flatMap(lambda x : x.split(" "))
rdd3 = rdd2.map(lambda x : (x,1))
rdd3.cache()
rdd4 = rdd3.reduceByKey(lambda a,b : a+b)
print(rdd4.collect())
rdd5 = rdd3.groupByKey()
rdd6 = rdd5.mapValues(lambda x: sum(x))
print(rdd6.collect())
rdd3.unpersist()
time.sleep(10000)
#checkpoint代码示例
#cording:utf8
import time
from pyspark import SparkConf,SparkContext
if __name__ == '__main__':
conf = SparkConf().setMaster('local[*]').setAppName('test')
sc = SparkContext(conf=conf)
# 1.告知spark,开启checkpoint功能
sc.setCheckpointDir('hdfs://pyspark01:8020/output/ckp')
rdd1 = sc.textFile("../input/words.txt")
rdd2 = rdd1.flatMap(lambda x : x.split(" "))
rdd3 = rdd2.map(lambda x : (x,1))
# 调用checkpoint API 保存数据即可
rdd3.checkpoint()
rdd4 = rdd3.reduceByKey(lambda a,b : a+b)
print(rdd4.collect())
rdd5 = rdd3.groupByKey()
rdd6 = rdd5.mapValues(lambda x: sum(x))
print(rdd6.collect())
time.sleep(10000)