文章目录
RDD持久化
spark重要特性,缓存数据在内存里。当持久化一个RDD的时候,RDD会把所有内存里的分区信息存储下来,这样就能够基于这个数据集做复用在以后的action里。
实验
scala> var info =sc.textFile("file:///home/hadoop/data/page_views.dat")
scala> info.count
res0: Long = 100000
再执行一次
发现还是一样的大小,说明数据还是从头加载的
使用cache
注意cache是lazy的,遇到action才计算
但是注意cache在rdd里lazy,在sparkSQL不是
cache是容错的,如果rdd的分区丢失,会自动计算回来。
scala> info.cache
scala> info.count
发现缓存成功,相当于把action后的数据缓存起来了
再次执行
scala> info.count
惊了,出入反而变得更大了
cache源码
那么为什么变大了呢,查看下源码
在RDD.scala里搜索cache(快捷键ctrl+F12)
cache() 调用persist(),persist调用重载的persist(StorageLevel.MEMORY_ONLY),默认使用只内存的存储策略
查看存储策略StorageLevel源码
object StorageLevel {
val NONE = new StorageLevel(false, false, false, false)
val DISK_ONLY = new StorageLevel(true, false, false, false)
val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
val MEMORY_ONLY = new StorageLevel(false, true, false, true)
val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
val MEMORY_AND_D