原因:每次重算RDD和RDD的依赖,消耗大
原理:计算出RDD的节点分别保存计算出的分区数据
故障:如果出现故障,可以对故障节点分区的数据重算,或者为每个分区保存多个副本
策略:如果持久化数据的存储空间不足,会采用LRU的策略将分区从内存中移除
持久化级别 默认序列化的形式存储在JVM的堆空间中
MEMORY_ONLY
MEMORY_ONLY_SER
MEMORY_AND_DISK
MEMORY_AND_DISK_SER
DISK_ONLY
DISK_ONLY_2 #_2把RDD持久化为两份副本
程序:
package thisisnobody.basic
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}
object test {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("filter").setMaster("local")
val sc = new SparkContext(conf)
val rdd = sc.parallelize(List(1,2,3,4))
val rdd1 = rdd.filter( x => x != 3)
rdd1.persist(StorageLevel.MEMORY_ONLY)
rdd1.foreach(println)
}
}
> 虽然在行动操作之前调用了persist(),但persist()并没有强制求值,转化操作还是行动操作按需执行
> 使用unpersist()手动把持久化RDD从缓存中删除