2021年大数据Spark(十七):Spark Core的RDD持久化
目录
RDD 持久化
引入
API
缓存/持久化函数
缓存/持久化级别
释放缓存/持久化
代码演示
总结:何时使用缓存/持久化
RDD 持久化
引入
在实际开发中某些RDD的计算或转换可能会比较耗费时间,如果这些RDD后续还会频繁的被使用到,那么可以将这些RDD进行持久化/缓存,这样下次再使用到的时候就不用再重新计算了,提高了程序运行的效率。
API
缓存/持久化函数
可以将RDD数据直接缓存到内存中,函数声明如下:
但是实际项目中,不会直接使用上述的缓存函数,RDD数据量往往很多,内存放不下的。在实际的项目中缓存RDD数据时,往往使用如下函数,依据具体的业务和数据量,指定缓存的级别
缓存/持久化级别
在Spark框架中对数据缓存可以指定不同的级别,对于开发来说至关重要,如下所示:
持久化级别 |
说明 |
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等 |
与上面的储存级别相同,只不过将持久化数据存为两份,备份每个分区存储在两个集群节点上。 |
OFF_HEAP(实验中) |
与MEMORY_ONLY_SER类似,但将数据存储在堆外内存中。 (即不是直接存储在JVM内存中) 如:Tachyon-分布式内存存储系统、Alluxio - Open Source Memory Speed Virtual Distributed Storage |
实际项目中缓存数据时,往往选择MEMORY_AND_DISK
缓存函数与Transformation函数一样,都是Lazy操作,需要Action函数触发,通常使用count函数触发。
释放缓存/持久化
当缓存的RDD数据,不再被使用时,考虑释资源,使用如下函数:
此函数属于eager,立即执行。
代码演示
package cn.itcast.coreimport org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}/*** RDD中缓存函数,将数据缓存到内存或磁盘、释放缓存*/
object SparkCacheTest {def main(args: Array[String]): Unit = {val sparkConf: SparkConf = new SparkConf().setAppName(this.getClass.getSimpleName.stripSuffix("$")).setMaster("local[*]")val sc: SparkContext = new SparkContext(sparkConf)sc.setLogLevel("WARN")// 读取文本文件数据val inputRDD: RDD[String] = sc.textFile("data/input/words.txt", minPartitions = 2)// 缓存数据inputRDD.persist(StorageLevel.MEMORY_AND_DISK)// 使用Action函数触发缓存println(s"Count = ${inputRDD.count()}")println(s"Count = ${inputRDD.count()}")// 释放缓存inputRDD.unpersist()// 应用程序运行结束,关闭资源sc.stop()}
}
或使用spark-shell演示
// 启动集群和spark-shell/export/servers/spark/sbin/start-all.sh// 将一个RDD持久化,后续操作该RDD就可以直接从缓存中拿val rdd1 = sc.textFile("hdfs://node1:8020/wordcount/input/words.txt")val rdd2 = rdd1.flatMap(x=>x.split(" ")).map((_,1)).reduceByKey(_+_)//WordCountrdd2.cache //缓存/持久化rdd2.sortBy(_._2,false).collect//触发action,会去读取HDFS的文件,rdd2会真正执行缓存/持久化rdd2.sortBy(_._2,false).collect//触发action,会去读缓存中的数据,执行速度会比之前快,因为rdd2已经持久化到内存中了
总结:何时使用缓存/持久化
在实际项目开发中,什么时候缓存RDD数据,最好呢???
第一点:当某个RDD被使用多次的时候,建议缓存此RDD数据
比如,从HDFS上读取网站行为日志数据,进行多维度的分析,最好缓存数据
第二点:当某个RDD来之不易,并且使用不止一次,建议缓存此RDD数据
比如,从HBase表中读取历史订单数据,与从MySQL表中商品和用户维度信息数据,进行关联Join等聚合操作,获取RDD:etlRDD,后续的报表分析使用此RDD,此时建议缓存RDD数据
案例: etlRDD.persist(StoageLeval.MEMORY_AND_DISK_2)
2021年大数据Spark(十七):Spark Core的RDD持久化相关推荐
- 大数据技术之Spark(一)——Spark概述
大数据技术之Spark(一)--Spark概述 文章目录 前言 一.Spark基础 1.1 Spark是什么 1.2 Spark VS Hadoop 1.3 Spark优势及特点 1.3.1 优秀的数 ...
- 大数据求索(8):Spark Streaming简易入门一
大数据求索(8):Spark Streaming简易入门一 一.Spark Streaming简单介绍 Spark Streaming是基于Spark Core上的一个应用程序,可伸缩,高吞吐,容错( ...
- 2021年大数据Hadoop(二十七):YARN运行流程
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn运行流程 本系列历史文章 2021年大数据Hado ...
- 成都大数据Hadoop与Spark技术培训班
成都大数据Hadoop与Spark技术培训班 中国信息化培训中心特推出了大数据技术架构及应用实战课程培训班,通过专业的大数据Hadoop与Spark技术架构体系与业界真实案例来全面提升大数据工程师.开 ...
- 大数据入门:Spark RDD、DataFrame、DataSet
在Spark的学习当中,RDD.DataFrame.DataSet可以说都是需要着重理解的专业名词概念.尤其是在涉及到数据结构的部分,理解清楚这三者的共性与区别,非常有必要.今天的大数据入门分享,我们 ...
- 大数据hadoop,spark数据分析之 基于大数据平台的运营商在线服务系统设计
今天向大家介绍一个帮助往届学生完成的毕业设计项目,大数据hadoop,spark数据分析之 基于大数据平台的运营商在线服务系统设计. 基于大数据平台的运营商在线服务系统设计 随着通信行业的业务拓展以及 ...
- 行业大数据 -- 基于hadoop+spark+mongodb+mysql开发医院临床知识库系统(建议收藏)
一.前言 从20世纪90年代数字化医院概念提出到至今的20多年时间,数字化医院(Digital Hospital)在国内各大医院飞速的普及推广发展,并取得骄人成绩.不但有数字化医院管理信息系统(HIS ...
- mllib逻辑回归 spark_大数据技术之Spark mllib 逻辑回归
本篇教程探讨了大数据技术之Spark mllib 逻辑回归,希望阅读本篇文章以后大家有所收获,帮助大家对大数据技术的理解更加深入. 逻辑回归 逻辑回归其实是一个分类算法而不是回归算法.通常是利用已知的 ...
- 大数据实时处理-基于Spark的大数据实时处理及应用技术培训
随着互联网.移动互联网和物联网的发展,我们已经切实地迎来了一个大数据 的时代.大 数据是指无法在一定时间内用常规软件工具对其内容进行抓取.管理和处理的数据集合,对大数据的分析已经成为一个非常重要且紧迫 ...
最新文章
- 经验分享 | 通过adbd配置漏洞在安卓设备上提升权限
- Netweaver和CloudFoundry的服务器日志
- java中jnum i .length,java数组和多维数组
- batch downloading file in python
- java lua脚本_请问该如何在Java中使用Lua脚本语言?
- ObjC点击H5图片Native预览
- VC++可视化编程——创建空白窗口
- 【机器人学:运动规划】快速搜索随机树(RRT---Rapidly-exploring Random Trees)入门及在Matlab中演示
- Python+OpenCV实现sobel边缘检测
- 距离2022年研究生考试还有多少天?倒计时天数用便签设置
- 东方博易OJ——1002 - 【入门】编程求解1+2+3+...+n
- dns配置异常怎么修复_dns配置异常不能上网如何修复
- mysql 1032_MySQL 报错 Last_SQL_Errno: 1032
- 优先级反转和优先级继承
- 微信公众号使用Emoji表情
- 区分: 间宾直宾(双宾语) 宾补(复合宾语)
- 2022网络安全技术及应用复习重点
- App Uploader下载安装
- 为超链接设置confirm对话框
- 关于Vmware软件中虚拟机不能出现VMnet0的解决方法