Spark RDD 是惰性求值的,而有时我们希望能多次使用同一个 RDD。如果简单地对 RDD 调用行动操作,Spark 每次都会重算 RDD 以及它的所有依赖。这在迭代算法中消耗格外大,因为迭代算法常常会多次使用同一组数据。

比如下面就是先对 RDD 作一次计数、再把该 RDD 输出的一个小例子。

val result = input.map(x => x*x)

println(result.count())

println(result.collect().mkString(","))

为了避免多次计算同一个 RDD,可以让 Spark 对数据进行持久化。当我们让 Spark 持久化存储一个 RDD 时,计算出 RDD 的节点会分别保存它们所求出的分区数据。如果一个有持久化数据的节点发生故障,Spark 会在需要用到缓存的数据时重算丢失的数据分区。如果希望节点故障的情况不会拖累我们的执行速度,也可以把数据备份到多个节点上。

出于不同的目的,我们可以为 RDD 选择不同的持久化级别(如下表)。在 Scala和 Java 中,默认情况下 persist() 会把数据以序列化的形式缓存在 JVM 的堆空间中。在 Python 中,我们会始终序列化要持久化存储的数据,所以持久化级别默认值就是以序列化后的对象存储在 JVM 堆空间中。当我们把数据写到磁盘或者堆外存储上时,也总是使用序列化后的数据。

持久化级别:

 

检查点checkpoint:

RDD能够在第一次计算完之后,将计算结果保存到内存、本地文件系统或者HDFS中。通过缓存,Spark避免了RDD上的重复计算,能够极大地提高计算速度。但是如果缓存丢失了,则需重新计算。如果计算特别复杂或者计算特别耗时,那么缓存丢失对于整个job的影响是不容忽视的。为了避免缓存丢失重新计算带来的开销,Spark有引入了检查点(checkpoint)机制。

checkpoint将RDD持久化到磁盘,还可以切断RDD之间的依赖关系(这里的意思是,后面的RDD找数据的时候,就可以直接从checkpoint持久化目录里找了)。

checkpoint 的执行原理:

(1)当RDD的job执行完毕后,会从finalRDD从后往前回溯。

(2)当回溯到某一个RDD调用了checkpoint方法,会对当前的RDD做一个标记。

(3)Spark框架会自动启动一个新的job,重新计算这个RDD的数据,将数据持久化到HDFS上。

优化:对RDD执行checkpoint之前,最好对这个RDD先执行cache,这样新启动的job只需要将内存中的数据拷贝到HDFS上就可以,省去了重新计算这一步。

使用:

public class Demo04CheckPoint {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setMaster("local").setAppName("test");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> lines = sc.textFile("./word");
sc.setCheckpointDir("./checkpoint");
lines = lines.cache();
lines.checkpoint();
lines.collect();
sc.stop();
sc.close();
}
}

当然此处只是为了测试,一般我们会把checkpoint持久化的数据存储在HDFS上面。

RDD持久化(缓存)相关推荐

  1. Spark基础学习笔记20:RDD持久化、存储级别与缓存

    文章目录 零.本讲学习目标 一.RDD持久化 (一)引入持久化的必要性 (二)案例演示持久化操作 1.RDD的依赖关系图 2.不采用持久化操作 3.采用持久化操作 二.存储级别 (一)持久化方法的参数 ...

  2. 2021年大数据Spark(十七):Spark Core的RDD持久化

    目录 RDD 持久化 引入 API 缓存/持久化函数 缓存/持久化级别 释放缓存/持久化 代码演示 总结:何时使用缓存/持久化 RDD 持久化 引入 在实际开发中某些RDD的计算或转换可能会比较耗费时 ...

  3. Spark的RDD持久化

    RDD持久化 1. RDD Cache 缓存 说明 RDD 通过Cache 或者Persist 方法将前面的计算结果缓存,默认情况下会把数据以缓存在JVM 的堆内存中.但是并不是这两个方法被调用时立即 ...

  4. Spark RDD概念学习系列之rdd持久化、广播、累加器(十八)

    1.rdd持久化 2.广播 3.累加器 1.rdd持久化 通过spark-shell,可以快速的验证我们的想法和操作! 启动hdfs集群 spark@SparkSingleNode:/usr/loca ...

  5. Spark RDD的缓存

    Spark速度非常快的原因之一,就是在不同操作中可以在内存中持久化或者缓存数据集.当持久化某个RDD后,每一个节点都将把计算分区结果保存在内存中,对此RDD或衍生出的RDD进行的其他动作中重用.这使得 ...

  6. RDD持久化、广播、累加器

    1.持久化 RDD的持久化包括两个方面:①操作RDD的时候怎么保存结果,这个部分属于action算子的部分②在实现算法的时候要进行cache.persist,还有checkpoint进行持久化. 1. ...

  7. PySpark | RDD持久化 | 共享变量 | Spark内核调度

    文章目录 一.RDD持久化 1.RDD的数据是过程数据 2.RDD缓存 2.1 RDD缓存的特点 2.2 cache()与unpersist()实战 3.RDD CheckPoint 3.1 Chec ...

  8. PySpark基础入门(3):RDD持久化

    RDD的持久化 RDD 的数据是过程数据,因此需要持久化存储: RDD之间进行相互迭代的计算,新的RDD的生成代表着旧的RDD的消失:这样的特性可以最大化地利用资源,老旧地RDD可以及时地从内存中清理 ...

  9. Spark RDD 持久化

    RDD Cache 缓存 RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存,默认情况下会把数据以缓存在 JVM 的堆内存中.但是并不是这两个方法被调用时立即缓存,而是触发后面的 ...

最新文章

  1. 【TAMU】最新《时间序列分析》课程笔记
  2. 说普通话时舌头卷不起来是一种什么体验?| 今日最佳
  3. 如何批量查询PR值、百度权重、百度快照及收录量,用BlueCatTools批量网站查询工具
  4. 16进制在c语言中用来做什么,十六进制在代码中有什么用
  5. 【网络基础】《TCP/IP详解》学习笔记4
  6. Linux中Docker常用命令
  7. 为什么我们需要再给 Firefox 一次机会?
  8. bzoj 1663: [Usaco2006 Open]赶集(最长路)
  9. Jenkins系列一Linux环境安装Jenkins
  10. matlab瓶盖盖严检查,口服液瓶盖密封性的质量检测方法你知道吗?
  11. 基于中文形近字相似度与加权编辑距离融合实现的汉字纠错算法
  12. 排序算法伪代码以及python实现——插入,归并,快速,堆,计数
  13. 【转】最落魄的日子你是怎样熬过来的?
  14. 深度分享Windows11系统全新4K高清壁纸
  15. labview教学视频:http://www.51zxw.net/study.asp?vip=19649795
  16. [转载]jQuery诞生记-原理与机制
  17. Jetpack Compose 从入门到入门(六)
  18. hexo修改index.html,Hexo自定义页面做首页
  19. EMQX集群部署:haproxy负载均衡+tls认证
  20. 2021年在全球及中国卫星发射数量、在轨卫星及市场规模分析[图]

热门文章

  1. Log4j 日志输出学习(Eclipse)
  2. MVC学习一:MVC简单流程
  3. Java23个设计模式的简明教程
  4. Linux系统下如何设置IP地址?
  5. BamlViewer修改
  6. 从Hadoop看普通算法在一个系统中的应用
  7. VI命令详解(大全)
  8. Leetcode 5
  9. 远程管理 Mac OSX 设备
  10. 安全漏洞问题6:SQL注入