零、本讲学习目标
理解RDD持久化的必要性
了解RDD的存储级别
学会如何查看RDD缓存
一、RDD持久化
(一)引入持久化的必要性
Spark中的RDD是懒加载的,只有当遇到行动算子时才会从头计算所有RDD,而且当同一个RDD被多次使用时,每次都需要重新计算一遍,这样会严重增加消耗。为了避免重复计算同一个RDD,可以将RDD进行持久化。
Spark中重要的功能之一是可以将某个RDD中的数据保存到内存或者磁盘中,每次需要对这个RDD进行算子操作时,可以直接从内存或磁盘中取出该RDD的持久化数据,而不需要从头计算才能得到这个RDD。
(二)案例演示持久化操作
1、RDD的依赖关系图
读取文件,进行一系列操作,有多个RDD,如下图所示。
2、不采用持久化操作
在上图中,对RDD3进行了两次算子操作,分别生成了RDD4和RDD5。若RDD3没有持久化保存,则每次对RDD3进行操作时都需要从textFile()开始计算,将文件数据转化为RDD1,再转化为RDD2,最终才得到RDD3。
查看要操作的HDFS文件
以集群模式启动Spark Shell
按照图示进行操作,得RDD4和RDD5
查看RDD4内容,会从RDD1到RDD2到RDD3到RDD4跑一趟
显示RDD5内容,也会从RDD1到RDD2到RDD3到RDD5跑一趟
3、采用持久化操作
可以在RDD上使用persist()或cache()方法来标记要持久化的RDD(cache()方法实际上底层调用的是persist()方法)。在第一次行动操作时将对数据进行计算,并缓存在节点的内存中。Spark的缓存是容错的:如果缓存的RDD的任何分区丢失,Spark就会按照该RDD原来的转换过程自动重新计算并缓存。
计算到RDD3时,标记持久化
计算RDD4,就是基于RDD3缓存的数据开始计算,不用从头到尾跑一趟