cache / persist (效率高)
cache / persist :cache, persist使用场景: 一个application多次触发Action,为了复用前面RDD计算好的数据,避免反复读取HDFS(数据源) 中的数据和重复计算
可以将数据缓存到内存或磁盘[executor所在的磁盘],第一次触发Action才放入到内存或磁盘,以后再触发Action会读取缓存的RDD数据再进行操作并且复用缓存的数据
一个RDD多次触发缓存才有意义
如果将数据缓存到内存, 内存不够, 以分区为单位, 只缓存部分分区的数据
支持多种StorageLevel, 可以将数据序列化, 默认放入内存使用的是java对象存储,但是占用空间大, 优点速度快, 也可以使用其他的序列化方式
cache底层调用的是persist方法, 可以指定其他存储级别
cache和persist方法, 严格来说, 不是Transformation, 因为没有生成新的RDD,只是标记当前rdd要cache或persist
原始的数据, 经过整理过滤后再进行cache或persist效果更佳
生产环境建议使用kryo 作为默认的序列化器, 如果要cache或persist, 建议使用 MEMORY_AND_DISK_SER
persist 实现序列化(减小空间的占用,指定存储位置) 网站: spark.apache.org -->
scala> sc.getConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer") //设置序列化器
res17: org.apache.spark.SparkConf = org.apache.spark.SparkConf@3adcdbc0scala> import org.apache.spark.storage.StorageLevel //导包
import org.apache.spark.storage.StorageLevelscala> val rdd1 = sc.textFile("hdfs://linux01:8020/wc/part-00000")
rdd1: org.apache.spark.rdd.RDD[String] = hdfs://linux01:8020/wc/part-00000 MapPartitionsRDD[27] at textFile at <console>:29scala> rdd1.persist(StorageLevel.MEMORY_ONLY_SER) //是否序列化以及存储的位置
res18: rdd1.type = hdfs://linux01:8020/wc/part-00000 MapPartitionsRDD[27] at textFile at <console>:29scala> rdd1.count
res19: Long = 1scala> rdd1.unpersist(true) // true为不阻塞 默认false(阻塞) 默认unpersist异步的
res20: rdd1.type = hdfs://linux01:8020/wc/part-00000 MapPartitionsRDD[27] at textFile at <console>:29
ID RDD Name Storage Level Cached Partitions Fraction Cached Size in Memory Size on Disk 17 hdfs://linux01:8020/wc/part-00000 Memory Deserialized 1x Replicated 3 100% 112.0 B 0.0 B 19 hdfs://linux01:8020/wc/part-00000 Memory Deseria