RDD的持久化

一、RDD的数据是过程数据

        RDD之间进行相互迭代计算(Transformation的转换),当执行开启后,新RDD的生成,代表老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.硬盘中因为硬盘损坏也是可能丢失的。

三、RDD的checkpoint

        1.checkpoint概念

        CheckPoint技术,也是将RDD的数据,保存起来.但是它仅支持硬盘存储
        特点:
                ①它被设计认为是安全的

                ②不保留血缘关系

RDD的持久化_第1张图片 checkpoint示意图

        CheckPoint存储RDD数据,是集中收集各个分区数据进行存储。而缓存是分散存储。

#代码实现

#设置CheckPoint第一件事情,选择CP的保存路径
#如果是Local模式,可以支持本地文件系统,如果在集群运行,千万要用HDFS
sc.setcheckpointDir("hdfs:// node1:8020/output/bj52ckp")
#用的时候,直接调用checkpoint算子即可.
rdd.checkpoint()
        2.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)

你可能感兴趣的:(大数据,大数据)