Spark-RDD-持久化详解

news2024/12/22 14:52:26

Spark概述

在这里插入图片描述

Spark-RDD概述


1.持久化与序列化的关系

在Spark中,持久化(Persistence)和序列化(Serialization)是两个关键概念,它们在RDD处理过程中起着重要作用,并且有一定的关联:

(1)持久化(Persistence)

  • 持久化指的是将RDD的数据缓存在内存中,以便在后续操作中重复使用,而不必重新计算。
    在这里插入图片描述
    在这里插入图片描述

  • 这对于需要多次使用同一数据集的情况非常有用,可以提高性能和效率。
    在这里插入图片描述

  • Spark提供了多种持久化级别,可以选择将数据缓存在内存中、磁盘上或者在内存和磁盘之间进行平衡。
    在这里插入图片描述

(2)序列化(Serialization)

  • 序列化是将数据转换为字节流的过程,以便在网络上传输或者进行持久化存储。
  • 反之,反序列化是将字节流转换回原始数据的过程。
  • 在Spark中,由于RDD的数据需要在集群中的不同节点之间传输,因此需要对数据进行序列化和反序列化。
  • 通常情况下,Spark使用Kryo或者Java序列化来实现对象的序列化。

(3)关系

  • 持久化和序列化都涉及到数据的存储和传输,但是侧重点不同。

  • 持久化是为了在RDD的生命周期内减少重复计算而将数据缓存在内存或者磁盘上,从而提高性能。

  • 序列化是为了在集群中的不同节点之间传输数据或者进行持久化存储时,将数据转换为字节流,以便在网络上传输或者存储到磁盘中。

  • 在Spark中,通常会将持久化和序列化结合起来使用,通过将RDD的数据持久化到内存或者磁盘上,并使用序列化来优化数据的传输和存储效率,从而提高整体的性能。

  • RDD通过Cache或者Persist方法将前面的计算结果缓存,默认情况下会把数据以序列化的形式缓存在JVM的堆内存中。但是并不是这两个方法被调用时立即缓存,而是触发后面的action算子时,该RDD将会被缓存在计算节点的内存中,并供后面重用。


2.Spark持久化级别

当选择Spark中的持久化级别时,需要考虑多个因素,包括数据规模、内存和磁盘资源、性能需求以及容错性要求。
在这里插入图片描述

1.MEMORY_ONLY

  • 数据存储在内存中,以对象的形式存在,不进行序列化。这意味着数据可以直接使用,速度较快。
  • 适用于数据量较小且内存资源充足的情况。
  • 由于数据不进行序列化,因此存储和读取速度很快,但是如果数据量过大超过了可用内存,会导致内存溢出。

2.MEMORY_ONLY_SER

  • SER表示序列化
  • 数据以序列化的形式存储在内存中,以节省内存空间。每次读取数据时,需要进行反序列化。
  • 适用于数据量较大,但内存资源有限的情况。
  • 序列化后的数据占用的内存空间较小,可以有效地减少内存压力,但相应地增加了序列化和反序列化的开销。

3.MEMORY_AND_DISK

  • 数据首先尝试存储在内存中,如果内存不足,则会将部分数据存储到磁盘上,以保证数据的完整性。
  • 适用于数据量较大,但内存资源不足以完全存储所有数据的情况。
  • 尽管磁盘读取速度较慢,但可以有效地处理大规模数据。

4…MEMORY_AND_DISK_SER

  • 类似于MEMORYANDDISK,但数据以序列化的形式存储在内存中,以节省内存空间。
  • 需要时,可以将部分数据存储到磁盘上。
  • 适用于数据量很大,内存资源有限的情况。通过序列化数据,可以减少内存占用,并允许更多的数据存储在内存中。

5.DISK_ONLY

  • 数据完全存储在磁盘上,不存储在内存中。
  • 确保了数据的持久性,但会牺牲读取速度。
  • 适用于数据量非常大,无法完全放入内存的情况。
  • 尽管磁盘访问速度较慢,但可以保证数据的完整性和持久性。

6.MEMORY_ONLY_2, MEMORY_AND_DISK_2等

  • 这些级别与前述相应的级别类似,但它们会将数据备份到不同的节点上,以提高容错性。
  • 在存储级别的末尾加上“_2”表示持久化的数据存为两份。
  • 备份分区的副本使得在某个节点上数据丢失时可以从备份节点恢复数据。
  • 适用于对数据可靠性有较高要求的情况,通过备份可以提高容错性。

3.RDD CheckPoint检查点

RDD Checkpoint(检查点)是一种机制,用于将RDD的中间结果持久化到可靠的存储介质(通常是分布式文件系统),以便在RDD需要重新计算时,可以从检查点处重新加载数据,而不必重新执行整个RDD的计算链。这在需要对RDD进行多次计算或容错恢复时非常有用。

在这里插入图片描述

1.工作原理:

  • RDD Checkpoint通过将RDD的数据写入分布式文件系统(如HDFS)来实现。
    在这里插入图片描述

  • 一旦RDD被标记为Checkpoint,Spark会在计算RDD时,将RDD的数据写入到指定的分布式文件系统中,并将该RDD的依赖链截断,使其不再依赖父RDD,从而节省内存空间并提高容错性。
    在这里插入图片描述

  • 当需要重新计算RDD时,Spark会从Checkpoint处读取数据,而不是重新执行RDD的计算链。

  • 这大大减少了计算时间,并且由于数据已经持久化,因此可以保证容错性。

在这里插入图片描述

2.使用方法:

  • 要对RDD进行Checkpoint,首先需要调用RDD的checkpoint()方法,将其标记为Checkpoint。
    在这里插入图片描述

  • 然后,需要调用sc.setCheckpointDir()方法设置Checkpoint的存储目录。

  • 在Spark应用程序中,当RDD需要Checkpoint时,可以调用rdd.checkpoint()方法。

3.适用场景:

  • RDD Checkpoint适用于那些需要多次使用同一数据集进行计算的场景,以及对容错性要求较高的场景。
  • 例如,当某个RDD需要被多个Action操作使用,或者当需要对RDD进行缓存但内存不足时,可以考虑使用Checkpoint。

4.注意事项:

  • RDD Checkpoint会增加存储开销,因为需要将RDD的数据写入到分布式文件系统中

  • Checkpoint的存储目录应该设置在可靠的分布式文件系统上,并确保有足够的存储空间。

  • RDD Checkpoint应该谨慎使用,因为它会增加IO开销,并且在某些情况下可能会降低性能。

5. 缓存和检查点区别

  • (1)Cache缓存只是将数据保存起来,不切断血缘依赖。Checkpoint检查点切断血缘依赖。

  • (2)Cache缓存的数据通常存储在磁盘、内存等地方,可靠性低。Checkpoint的数据通常存储在HDFS等容错、高可用的文件系统,可靠性高。

  • (3)建议对checkpoint()的RDD使用Cache缓存,这样checkpoint的job只需从Cache缓存中读取数据即可,否则需要再从头计算一次RDD。

  • (4)如果使用完了缓存,可以通过unpersist()方法释放缓存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1685094.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows安装mingw32/w64

1.下载 MinGW-w64 WinLibs - GCCMinGW-w64 compiler for Windows Releases niXman/mingw-builds-binaries (github.com) MinGW-w64、UCRT 和 MSVCRT 是 Windows 平台上常用的 C/C 运行库,它们有以下不同点: MinGW-w64:是一个基于 GCC 的…

Transformer,革命性的深度学习架构

Transformer 是一种革命性的深度学习架构,专门设计用于处理序列数据,特别是在自然语言处理(NLP)任务中表现卓越。它由 Vaswani 等人在 2017 年发表的论文《Attention is All You Need》中首次提出,打破了当时基于循环神经网络(RNN)和卷积神经网络(CNN)的序列建模常规,…

Golang | Leetcode Golang题解之第108题将有序数组转换为二叉搜索树

题目: 题解: func sortedArrayToBST(nums []int) *TreeNode {rand.Seed(time.Now().UnixNano())return helper(nums, 0, len(nums) - 1) }func helper(nums []int, left, right int) *TreeNode {if left > right {return nil}// 选择任意一个中间位置…

基于Vue的图片文件上传与压缩组件的设计与实现

摘要 随着前端技术的发展,系统开发的复杂度不断提升,传统开发方式将整个系统做成整块应用,导致修改和维护成本高昂。组件化开发作为一种解决方案,能够实现单独开发、单独维护,并能灵活组合组件,从而提升开…

Leetcode861. 翻转矩阵后的得分

Every day a Leetcode 题目来源:861. 翻转矩阵后的得分 解法1:贪心 对于二进制数来说,我们只要保证最高位是1,就可以保证这个数是最大的,因为移动操作会使得它取反,因此我们进行行变化的时候只需要考虑首…

【Android安全】AOSP版本对应编号| AOSP版本适配Pixel或Nexus型号 | 驱动脚本下载地址

AOSP版本对应编号 https://source.android.com/docs/setup/about/build-numbers?hlzh-cn#source-code-tags-and-builds 例如android-8.1.0_r1 对应的编号是OPM1.171019.011 可以适配Pixel 2 XL AOSP驱动脚本下载 编译AOSP时,需要Google的驱动,后面才…

C++——类与对象(下)

​ 【本节内容】 目录 1. 再谈构造函数 2. static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合…

HTML用法介绍

文章目录 一、HTML概念和模版二、常用标签及用法1.p标签2.span标签3.h标签4.hr标签5.img标签6.a标签7.input标签8.table标签 一、HTML概念和模版 HTML的全称为超文本标记语言&#xff0c;它包括一系列标签组成&#xff0c;模版及各部分注释如下&#xff1a; <!--声明文档类…

从需求角度介绍PasteSpider(K8S平替部署工具适合于任何开发语言)

你是否被K8S的强大而吸引&#xff0c;我相信一部分人是被那复杂的配置和各种专业知识而劝退&#xff0c;应该还有一部分人是因为K8S太吃资源而放手&#xff01; 这里介绍一款平替工具PasteSpider&#xff0c;PasteSpider是一款使用c#编写的linux容器部署工具(使用PasteSpider和…

如何将Windows PC变成Wi-Fi热点?这里提供详细步骤

序言 Windows 10和Windows 11都有内置功能,可以将你的笔记本电脑(或台式机)变成无线热点,允许其他设备连接到它并共享你的互联网连接。以下是操作指南。 由于Windows中隐藏的虚拟Wi-Fi适配器功能,你甚至可以在连接到另一个Wi-Fi网络或无线路由器时创建Wi-Fi热点,通过另…

CSS学习笔记之高级教程(二)

10、CSS 3D 转换 通过 CSS transform 属性&#xff0c;您可以使用以下 3D 转换方法&#xff1a; rotateX()rotateY()rotateZ() 10.1 rotateX() 方法&#xff08;使元素绕其 X 轴旋转给定角度&#xff09; <!DOCTYPE html> <html lang"en"><head&g…

NLP(17)--大模型发展(1)

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 大模型的演化&#xff1a; ElMO : 类似双向lstm 结果和词向量拼接 预训练鼻祖 GPT :使用了Transformer 模型 开始使用Token &#xff08;发现预训练的作用&#xff09; Bert&#xff1a;认为双向比单向好 MLM(双向) 优于 LT…

ARP基本原理

相关概念 ARP报文 ARP报文分为ARP请求报文和ARP应答报文&#xff0c;报文格式如图1所示。 图1 ARP报文格式 Ethernet Address of destination&#xff08;0–31&#xff09;和Ethernet Address of destination&#xff08;32–47&#xff09;分别表示Ethernet Address of dest…

Linux中解决普通用户使用不了sudo问题

目录 sudo的使用场景sudo使用不了的原因解决方法 sudo的使用场景 之前我们介绍了文件的权限问题 如果一个普通用户想去执行一个它命令之外的权限&#xff0c;只能使用sudo 比如普通用户使用yum去安装软件&#xff0c;需要sudo yum xxxx sudo使用不了的原因 这里我们用普通用户…

浏览器的下载行为基本原理

浏览器解析 在使用浏览器访问某些资源时&#xff0c;有些资源是直接下载有些资源是直接打开。例如前端的html&#xff0c;xml&#xff0c;css&#xff0c;图片等资源都是直接打开&#xff0c;而txt&#xff0c;excel等文件是直接下载。那么如何控制访问一个资源时是下载文件还…

C# run Node.js

C# run nodejs Inter-Process Communication&#xff0c;IPC Process类 启动Node.js进程&#xff0c;通过标准输入输出与其进行通信。 // n.js// 监听来自标准输入的消息 process.stdin.on(data, function (data) {// 收到消息后&#xff0c;在控制台输出并回复消息console.l…

MyBatisPlus标准分页功能制作,以及设置分页拦截器,selectPage(new Page<>(current,size),null)

目录 1、设置分页拦截器 2、创建数据库及表 3、pom.xml 4、添加MP的相关配置信息 application.yml 5、根据数据库表创建实体类 User 6、创建 UserDao 接口 7、编写引导类 8、编写测试类 9、Run的运行结果 1、设置分页拦截器 package com.example.config; import com.baomidou.m…

从零开始傅里叶变换

从零开始傅里叶变换 1 Overview2 傅里叶级数2.1 基向量2.2 三角函数系表示 f ( t ) f(t) f(t)2.2.1 三角函数系的正交性2.2.2 三角函数系的系数 2.3 复指数函数系表示 f ( t ) f(t) f(t)2.3.1 复指数函数系的系数2.3.2 复指数函数系的正交性 2.4 傅里叶级数总结 3 傅里叶变换…

基于轻量级神经网络GhostNet开发构建CIFAR100数据集场景下的图像识别分析系统,对比不同分辨路尺度下模型的性能情况

Cifar100数据集是一个经典的图像分类数据集&#xff0c;常用于计算机视觉领域的研究和算法测试。以下是关于Cifar100数据集的详细介绍&#xff1a; 数据集构成&#xff1a;Cifar100数据集包含60000张训练图像和10000张测试图像。其中&#xff0c;训练图像分为100个类别&#x…

肯尼亚大坝决堤反思:强化大坝安全监测的必要性

一、背景介绍 近日&#xff0c;肯尼亚发生了一起严重的大坝决堤事件。当地时间4月29日&#xff0c;肯尼亚内罗毕以北的一座大坝决堤&#xff0c;冲毁房屋和车辆。当地官员称&#xff0c;事故遇难人数已升至71人。这起事件再次提醒我们&#xff0c;大坝安全无小事&#xff0c;监…