spark_RDD的持久化_缓存

RDD的持久化/缓存

在实际开发中某些RDD的计算或转换可能会比较耗费时间,如果这些RDD后续还会频繁的被使用到,那么可以将这些RDD进行持久化/缓存,这样下次再使用到的时候就不用再重新计算了,提高了程序运行的效率

持久化/缓存API详解

●persist方法和cache方法

RDD通过persist或cache方法可以将前面的计算结果缓存,但是并不是这两个方法被调用时立即缓存,而是触发后面的action时,该RDD将会被缓存在计算节点的内存中,并供后面重用。

通过查看RDD的源码发现cache最终也是调用了persist无参方法(默认存储只存在内存中)
在这里插入图片描述

代码演示

●启动集群和spark-shell

●将一个RDD持久化,后续操作该RDD就可以直接从缓存中拿

val rdd1 = sc.textFile("hdfs://node01:8020/wordcount/input/words.txt")
 
val rdd2 = rdd1.flatMap(x=>x.split(" ")).map((_,1)).reduceByKey(_+_)
 
rdd2.cache     //缓存/持久化 
rdd2.sortBy(_._2,false).collect   //触发action,会去读取HDFS的文件,rdd2会真正执行持久化
rdd2.sortBy(_._2,false).collect   //触发action,会去读缓存中的数据,执行速度会比之前快,因为rdd2已经持久化到内存中了

●存储级别
默认的存储级别都是仅在内存存储一份,Spark的存储级别还有好多种,存储级别在object StorageLevel中定义的

持久化级别 说明
MEMORY_ONLY(默认) 将RDD以非序列化的Java对象存储在JVM中。 如果没有足够的内存存储RDD,则某些分区将不会被缓存,每次需要时都会重新计算。 这是默认级别。
MEMORY_AND_DISK
(开发中可以使用这个) 说明将RDD以非序列化的Java对象存储在JVM中。如果数据在内存中放不下,则溢写到磁盘上.需要时则会从磁盘上读取
MEMORY_ONLY_SER
(Java and Scala) 将RDD以序列化的Java对象(每个分区一个字节数组)的方式存储.这通常比非序列化对象(deserialized objects)更具空间效率,特别是在使用快速序列化的情况下,但是这种方式读取数据会消耗更多的CPU。
MEMORY_AND_DISK_SER (Java and Scala) 与MEMORY_ONLY_SER类似,但如果数据在内存中放不下,则溢写到磁盘上,而不是每次需要重新计算它们。
DISK_ONLY 将RDD分区存储在磁盘上。
MEMORY_ONLY_2, MEMORY_AND_DISK_2等 说明

总结

1.RDD持久化/缓存的目的是为了提高后续操作的速度
2.缓存的级别有很多,默认只存在内存中,开发中使用memory_and_disk
3.只有执行action操作的时候才会真正将RDD数据进行持久化/缓存
4.实际开发中如果某一个RDD后续会被频繁的使用,可以将该RDD进行持久化/缓存

发布了126 篇原创文章 · 获赞 154 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_45737446/article/details/105574395