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。