一般情况下,RDD的计算过程是不会保留数据的。所以在重复使用RDD对象时,并不会重用数据,而是又重新计算了一遍,浪费资源、时间。
为了实现数据的重用,避免重复计算,需要进行持久化操作
当然,对于某些大数据量、计算时间过长的操作来说,因为有可能出现计算错误而导致从源头开始又计算一遍的情况,所以也需要进行数据持久化操作。
persist()
persist()
会把数据临时缓存在内存、磁盘当中(可手动指定)。若涉及到磁盘IO,则性能会受到影响。但保存在磁盘时数据也会较为安全。如果只保存在内存当中(StorageLevel.MEMORY_ONLY
),那么当内存较满时会放不下缓存文件,则缓存文件会被直接丢弃。由于是临时存储的缓存文件,不论是保存在内存中还是磁盘中,在作业执行完毕后就会被清除。
代码样例:
val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("NoPersist")
val sc = new SparkContext(sparkConf)
val rdd: RDD[String] = sc.makeRDD(List("hello world", "hello spark"))
val flatMap: RDD[String] = rdd.flatMap(_.split(" "))
val mapRDD: RDD[(String, Int)] = flatMap.map(
word => {
println("string => (String, Int)")
(word, 1)
}
)
// 数据持久化 便于数据重用
// mapRDD.cache()
mapRDD.persist(StorageLevel.MEMORY_AND_DISK)
println(mapRDD.toDebugString