PySpark RDD的缓存和Checkpoint

news/2024/10/25 17:18:27/

文章目录

  • 1. 前言
  • 2. RDD的缓存
  • 3. RDD的CheckPoint

1. 前言

RDD之间进行相互迭代计算(Transformation的转换),当执行开启后,新RDD的生成,代表老RDD的消息,RDD的数据只在处理的过程中存在,一旦处理完成,就不见了,所以RDD的数据是过程数据。

RDD数据是过程数据的这个特性可以最大化的利用资源,老旧的RDD没用了就会从内存中清理,给后续的计算腾出内存空间。

在这里插入图片描述
如上图,rdd3被2次使用,第一次使用之后,其实rdd3就不存在了,在第二次使用的时候,只能基于RDD的血缘关系,从RDD1重新执行,构建出来RDD3,供RDD5使用。

2. RDD的缓存

Spark中提供了缓存API,可以让我们通过调用API,将指定的RDD数据保留在内存或者硬盘上。上述场景如果使用缓存API,RDD3就不会消失,第二次使用RDD3的时候就不会在通过血缘关系重新开始构建出RDD3

# RDD3 被2次使用,可以加入缓存进行优化
rdd3.cache() 									# 缓存到内存中.
rdd3.persist(StorageLevel.MEMORY_ONLY) 			# 仅内存缓存
rdd3.persist(StorageLevel.MEMORY_ONLY_2)		# 仅内存缓存,2个副本
rdd3.persist(StorageLevel.DISK_ONLY)			# 仅缓存硬盘上
rdd3.persist(StorageLevel.DISK_ONLY_2)			# 仅缓存硬盘上,2个副本
rdd3.persist(StorageLevel.DISK_ONLY_3)			# 仅缓存硬盘上,3个副本
rdd3.persist(StorageLevel.MEMORY_AND_DISK)		# 先放内存,不够放硬盘
rdd3.persist(StorageLevel.MEMORY_AND_DISK_2)	# 先放内存,不够放硬盘,2个副本
rdd3.persist(StorageLevel.OFF_HEAP)				# 堆放内存(系统内存)
# 如上API,自行选择使用即可
# 一般建议使用rdd3.persist(StorageLevel.MEMORY_AND_DISK)
# 如果内存比较小的集群,建议使用rdd3.persist(StorageLevel.DISK_ONLY) 或者别用缓存了 用CheckPoint# 主动清理缓存的API
rdd.unpersist() 

在这里插入图片描述
如上图,RDD是将自己分区的数据,每个分区自行将其数据保存在其所在的Executor内存和硬盘上,这就是分散存储

缓存技术可以将过程RDD数据,持久化保存到内存或者硬盘上,但是这个保存在设定上是认为不安全的,存在丢失的风险,所以缓存有一个特点就是保存RDD之间的血缘关系
一旦缓存丢失,可以基于血缘关系的记录,重新计算这个RDD的数据。

缓存一般是如果丢失的?

  • 在内存中的存储是不安全的,比如断电\计算任务内存不足,把缓存清理给计算让路
  • 硬盘中因为硬盘的损坏也是可能丢失的

3. RDD的CheckPoint

Spark中Checkpoint技术,也是将RDD的数据保存起来,但是它只支持硬盘存储,并且它被设计认为是安全的,不保留血缘关系。

在这里插入图片描述

如上图,Checkpoint存储的RDD数据是集中收集各个分区的数据进行存储,而缓存是分散存储

缓存和Checkpoint的对比:

  1. CheckPoint不管分区数量多少,风险都一样。 缓存:分区越多,风险越多
  2. CheckPoint支持写入HDFS,缓存不行。HDFS是高可靠存储,CheckPoint被认为是安全的
  3. CheckPoint不支持内存,缓存可以。缓存如果写内存 性能比 CheckPoint 要好一些
  4. CheckPoint因为设计是安全的,所以不保留血缘关系,而缓存则相反。

实现:

# 设置CheckPoint第一件事情,选择Checkpoint的保存路径
# 如果Local模式,可以支持本地文件系统,如果在集群运行,千万要用HDFS
sc.setCheckpointDir("hdfs://master:8020/output/11111")
# 用的时候,直接调用checkpoint算子即可,但是需要有action算子触发
rdd.checkpoint()
rdd.count()# TODO: 再次执行count函数, 此时从checkpoint读取数据
rdd.count()

Checkpoint是一种重量级的使用,也就是RDD的重新计算成本很高的时候,我们采用Checkpoint比较合适,或者数据量很大的时候,采用Checkpoint比较合适。如果数据量小,或者RDD重新计算也是非常快的,直接使用缓存即可。

**注意:**Spark中缓存和Checkpoint两个API都不是action算子,所以需要后面跟action算子才能触发。


http://www.ppmy.cn/news/38476.html

相关文章

SQL VQ14 统计每天刷题数超过5的user_id以及刷题数

SQL VQ14 统计每天刷题数超过5的user_id以及刷题数数据需求解决题目 : https://www.nowcoder.com/practice/852a14b888c448f1a26f0e2e20f668a7?tpId341 数据 drop table if exists questions_pass_record_detail;CREATE TABLE questions_pass_record_detail ( user_id int N…

Edge集锦没有同步按钮 - 待解决

问题 日期:2023年4月6日 2023年2月份左右,更新Edge后,集锦的同步选项消失了,右键标签页也没有添加到集锦的选项,如下图。 详细说明此问题,Edge一旦登录个人账号,集锦同步选项就会消失&#…

RedHat6.7部署Oracle11g服务端

RedHat6.7部署Oracle11g服务端 文章目录1 安装准备工作1.1 选择Oracle的版本1.2 硬件检测1.3 操作系统检测和配置1.3.1 关闭防火墙与selinux1.3.2 HOST 文件检查1.3.3 挂载镜像并配置yum源1.3.4 下载所需依赖包与图形化插件1.3.5 创建必须的用户组和用户,并修改密码…

RocketMQ消息高可靠详解

文章目录 消息同步策略殊途同归同步基于offset而不是消息本身刷盘策略RocketMQ broker服务端以组为单位提供服务的,拥有着一样的brokerName则认为是一个组。其中brokerId=0的就是master,大于0的则为slave。 消息同步策略 master和slave都可以提供读服务,但是只有master允许…

Java接口

目录 抽象类 抽象类的概述 如何使用抽象类 抽象类的使用 抽象特征 关于抽象需要注意的几个事情 接口(interface) 常量 如何实现接口 接口与接口多继承 接口的注意事项 抽象类 抽象类的概述 父类中的方法,被它的子类们重写,子类各自的实现都不…

异构计算给我们带来了哪些思考?

虽然异构计算的快速发展给企业创新带来了更加强大的算力支撑,但真正推动异构计算的高速发展和应用落地,笔者认为还需要在以下三个方面做好功课。 从2022年火爆全球的元宇宙,到今年的ChatGPT,以人工智能为代表的科学技术正在创造出…

【图论刷题-6】力扣 797. 所有可能的路径

图论刷题 机器人的运动范围矩阵中的路径图像渲染水位上升的泳池中游泳寻找图中是否存在路径所有可能的路径 797. 所有可能的路径 力扣地址:https://leetcode.cn/problems/all-paths-from-source-to-target/ 这是一道比较典型的深度优先遍历、广度优先遍历案例&…

关于Intellij idea 报错:Error : java 不支持发行版本5的问题

在Intellij idea中新建了一个Maven项目,运行时报错如下:Error : java 不支持发行版本5 本地运行用的是JDK9,测试Java的Stream操作,报错应该是项目编译配置使用的Java版本不对,需要检查一下项目及环境使用的Java编译版本…