Spark中RDD的缓冲和持久化

1、缓冲

缓冲的作用:可以在内存中持久化或缓存多个数据集。当持久化某个RDD后,每一个节点都将把计算的分片结果保存在内存中,如果对这个RDD进行重复使用的时候,就不需要重复计算了,可以直接从缓冲中取。

缓冲的使用:

    //persist() 会对当前RDD进行持久化,可以使用参数来设置缓冲的方式,如在内存中、磁盘中、内存加磁盘
    pairRdd.persist(pairRdd.persist(StorageLevel.MEMORY_AND_DISK))

    //cache()  其实是持久化persisit的一种方式,基于内存的。默认以java序列化的方式,保存到内存中,且默认保存一份。
    pairRdd.cache()

在这里插入图片描述

 注意:

1、调用cache或者persist之后,必须触发action类的算子,才会写入到相应的介质中,并不是这两个方法被调用时立即缓存。

2、如果内存足够,那么所有的分区数据会写入到内存中,如果内存不足,缓存有可能丢失,RDD的缓存容错机制保证了即使缓存丢失也能保证计算的正确执行。通过基于RDD的一系列转换,丢失的数据会被重算,由于RDD的各个Partition是相对独立的,因此只需要计算丢失的部分即可,并不需要重算全部Partition。

3、rdd之间的依赖关系没有改变,如果没有cache数据,那么任务就会从头开始执行。

2、持久化

持久化的介绍:把rdd的分区数据,写入到分布式的文件系统,HDFS。会把一个rdd中的所有分区的数据,以二进制文本形式,存储在hdfs的目录中,然后原有的rdd的依赖关系被删除,新的rdd称之为CheckPointRDD。

CheckPoint的使用:

    val pairRdd = sc.parallelize(List((1,1), (5,10), (5,9), (2,4), (3,5), (3,6),(4,7), (4,8),(2,3), (1,2)),4)
    //设置checkpoink目录
    sc.setCheckpointDir("hdfs://master:9000/ckpoint")
    //对rdd进行缓存,然后再执行checkpoint
    pairRdd.cache().checkpoint()

注意:

需要先在sparkContext对象上设置checkpoint目录,必须是分布式文件系统的目录,多个sparkContext是可以共享一个checkpoink目录。

当在某一个rdd上执行checkpoint时,并没有立刻写入文件,当执行action的时候,才触发任务。

一个checkpoint操作,会产生2个job。先会正常运行一个job,然后再启动一个job把分区中的数据写入到hdfs文件系统中。

在进行checkpoint之前,可以对rdd进行缓存,然后再执行checkpoint。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值