设置缓存的作用
- cache和persist都是用于将一个RDD进行缓存的,这样在之后使用的过程中就不需要重新计算了,可以大大节省程序运行时间
- cache和persist的区别:cache只有一个默认的缓存级别MEMORY_ONLY ,而persist可以根据情况设置其它的缓存级别。
cache
- 缓存RDD,缓存级别为仅在内存中
- cache方法实际上调用了无参数的persist方法,cache只有一个默认的缓存级别MEMORY_ONLY
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("cachedemo")
val sc: SparkContext = SparkContext.getOrCreate(conf)
val rdd1: RDD[String] = sc.textFile("in/users.csv")
rdd1.cache()
var start: Long = System.currentTimeMillis()
println(rdd1.count())
var end: Long = System.currentTimeMillis()
println("第一次打印数量的时间差"+(end - start))
start= System.currentTimeMillis()
println(rdd1.count())
end=System.currentTimeMillis()
println("第二次打印数量的时间差"+(end - start))
38210
第一次打印数量的时间差328
38210
第二次打印数量的时间差20
persist
- persist有一个 StorageLevel 类型的参数,这个表示的是RDD的缓存级别
- 取消缓存统一使用unpersist()方法
- 一般情况下建议使用persist(StorageLevel.MEMORY_AND_DISK)方法替代cache()方法,以防止内存不足造成程序运行错误
- StorageLevel设定有12种缓存策略,可以根据自己的情况选择合适的

val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("cachedemo")
val sc: SparkContext = SparkContext.getOrCreate(conf)
val rdd1: RDD[String] = sc.textFile("in/users.csv")
rdd1.persist(StorageLevel.MEMORY_ONLY)
var start: Long = System.currentTimeMillis()
println(rdd1.count())
var end: Long = System.currentTimeMillis()
println("第一次打印数量的时间差"+(end - start))
start= System.currentTimeMillis()
println(rdd1.count())
end=System.currentTimeMillis()
println("第二次打印数量的时间差"+(end - start))
start= System.currentTimeMillis()
println(rdd1.count())
end=System.currentTimeMillis()
println("第三次打印数量的时间差"+(end - start))
rdd1.unpersist()
start= System.currentTimeMillis()
println(rdd1.count())
end=System.currentTimeMillis()
println("第四次打印数量(缓存失效)的时间差"+(end - start))
38210
第一次打印数量的时间差320
38210
第二次打印数量的时间差19
38210
第三次打印数量的时间差10
38210
第四次打印数量(缓存失效)的时间差41