persist
persist() 用来设置RDD的存储级别.
常用的cache是persist的一种特例.
存储级别 | 意义 |
---|
MEMORY_ONLY | 将RDD作为反序列化的的对象存储在JVM中;如果RDD不能被内存装下,超出的分区将不会被缓存,并且在需要的时候被重新计算; 这是默认的级别. |
MEMORY_AND_DISK | 将RDD作为反序列化的的对象存储在JVM中;如果RDD不能被内存装下,超出的分区将被保存在硬盘上,并且在需要时被读取. |
MEMORY_ONLY_SER | 将RDD作为序列化的的对象进行存储(每一分区占用一个字节数组);通常来说,这比将对象反序列化的空间利用率更高,尤其当使用fast serializer,但在读取时会比较占用CPU |
MEMORY_AND_DISK_SER | 与MEMORY_ONLY_SER相似,并且超出内存的分区将存储在硬盘上,而不是在每次需要的时候重新计算. |
DISK_ONLY | 只将RDD分区存储在硬盘上. |
MEMORY_ONLY_2,MEMORY_AND_DISK_2, etc. | 与上述的存储级别一样,并且将每一个分区都复制到集群的两个结点上(备份). |
import org.apache.spark.storage.StorageLevel
val rdd1 = sc.parallelize(List(1,2,3,4,5,6,7,8),8)
val rdd2 = rdd1.persist(StorageLevel.DISK_ONLY)
rdd2.count()
rdd1.persist()
cache和persist的区别:
StorageLevel设定有12种缓存策略,可以根据自己的情况选择合适的.
cache方法其实是persist方法的一个特例:调用的是无参数的persist(),代表缓存级别是仅内存的情况.
一般情况下建议使用persist(StorageLevel.MEMORY_AND_DISK)方法替代cache方法,以防止内存不足造成程序运行错误.
persist方法有三种:
1.默认无参数仅内存级别的persist();
2.persist(newLevel):这个方法需要之前对RDD没有设置过缓存级别;
3.persist(newLevel,allowOverride):这个方法适用于之前对RDD设置过缓存级别,但是需要修改缓存级别的情况.
unpersist
rdd2.unpersist()