一、RDD持久化
2、不采用持久化操作
查看要操作的文件
启动Spark Shell
按照图示进行操作,得RDD4和RDD5
计算RDD4,会RDD1到RDD2到RDD3到RDD4跑一趟,查看结果
计算RDD5,也会RDD1到RDD2到RDD3到RDD4跑一趟,查看结果
3、采用持久化操作
计算RDD4,就是基于RDD3缓存的数据开始计算,不用从头到尾跑一趟
计算RDD5,就是基于RDD3缓存的数据开始计算,不用从头到尾跑一趟
二、案例演示设置存储级别
在net.huawei.rdd
包里创建TestPersist
对象
package net.huawei.rdd
import org.apache.log4j.{Level, Logger}
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
/**
* 功能:演示持久化操作
* 作者:华卫
* 日期:2022年04月11日
*/
object TestPersist {
def main(args: Array[String]): Unit = {
// 创建Spark配置对象
val conf = new SparkConf()
conf.setAppName("TestPersist")
.setMaster("local")
.set("spark.testing.memory", "2147480000")
// 基于配置创建Spark上下文
val sc = new SparkContext(conf)
// 去除Spark运行信息
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("com").setLevel(Level.OFF)
System.setProperty("spark.ui.showConsoleProgress", "false")
Logger.getRootLogger().setLevel(Level.OFF)
//创建RDD
val rdd: RDD[Int] = sc.parallelize(List(100, 200, 300, 400, 500))
//将RDD标记为持久化,默认存储级别为StorageLevel.MEMORY_ONLY
rdd.persist()
// rdd.persist(StorageLevel.DISK_ONLY) //持久化到磁盘
// rdd.persist(StorageLevel.MEMORY_AND_DISK)//持久化到内存,将溢出的数据持久化到磁盘
// 第一次行动算子计算时,将对标记为持久化的RDD进行持久化操作
val result: String = rdd.collect().mkString(", ")
println(result)
// 第二次行动算子计算时,将直接从持久化的目的地读取数据进行操作,而不需要从头计算数据
rdd.collect().foreach(println)
}
}
三、利用Spark WebUI查看缓存
(一)创建RDD并标记为持久化
(二)Spark WebUI查看RDD存储信息
- 浏览器中访问Spark Shell的WebUI
http://master:4040/storage/
查看RDD存储信息,可以看到存储信息为空
执行命令:rdd.collect()
,收集RDD数据
刷新WebUI,发现出现了一个ParallelCollectionRDD
的存储信息,该RDD的存储级别为MEMORY
,持久化的分区为8
,完全存储于内存中。
单击ParallelCollectionRDD
超链接,可以查看该RDD的详细存储信息
执行以下命令,创建rdd2,并将rdd2持久化到磁盘
刷新上述WebUI,发现多了一个MapPartitionsRDD
的存储信息,该RDD的存储级别为DISK
,持久化的分区为8
,完全存储于磁盘中。
(三)将RDD从缓存中删除
- 执行以下命令,将
rdd(ParallelCollectionRDD)
从缓存中删除
刷新上述WebUI,发现只剩下了MapPartitionsRDD
,ParallelCollectionRDD
已被移除。
- Spark会自动监视每个节点上的缓存使用情况,并以最近最少使用的方式从缓存中删除旧的分区数据。如果希望手动删除RDD,而不是等待该RDD被Spark自动从缓存中删除,那么可以使用RDD的
unpersist()
方法。