Spark大数据处理讲课笔记3.5 RDD持久化机制

news2024/9/23 19:24:53

文章目录

  • 零、本讲学习目标
  • 一、RDD持久化
    • (一)引入持久化的必要性
    • (二)案例演示持久化操作
      • 1、RDD的依赖关系图
      • 2、不采用持久化操作
      • 3、采用持久化操作
  • 二、存储级别
    • (一)持久化方法的参数
    • (二)Spark RDD存储级别表
    • (三)如何选择存储级别 - 权衡内存使用率和CPU效率
    • (四)查看persist()与cache()方法源码
    • (五)案例演示设置存储级别
  • 三、利用Spark WebUI查看缓存
    • (一)创建RDD并标记为持久化
    • (二)Spark WebUI查看RDD存储信息
    • (三)将RDD从缓存中删除

零、本讲学习目标

  1. 理解RDD持久化的必要性
  2. 了解RDD的存储级别
  3. 学会如何查看RDD缓存

一、RDD持久化

(一)引入持久化的必要性

  • Spark中的RDD是懒加载的,只有当遇到行动算子时才会从头计算所有RDD,而且当同一个RDD被多次使用时,每次都需要重新计算一遍,这样会严重增加消耗。为了避免重复计算同一个RDD,可以将RDD进行持久化。
  • Spark中重要的功能之一是可以将某个RDD中的数据保存到内存或者磁盘中,每次需要对这个RDD进行算子操作时,可以直接从内存或磁盘中取出该RDD的持久化数据,而不需要从头计算才能得到这个RDD。

(二)案例演示持久化操作

1、RDD的依赖关系图

  • 读取文件,进行一系列操作,有多个RDD,如下图所示。
    在这里插入图片描述

2、不采用持久化操作

  • 在上图中,对RDD3进行了两次算子操作,分别生成了RDD4和RDD5。若RDD3没有持久化保存,则每次对RDD3进行操作时都需要从textFile()开始计算,将文件数据转化为RDD1,再转化为RDD2,最终才得到RDD3。
  • 查看要操作的文件
    在这里插入图片描述
  • 启动Spark Shell
    在这里插入图片描述
  • 按照图示进行操作,得RDD4和RDD5
    在这里插入图片描述
  • 计算RDD4,会RDD1到RDD2到RDD3到RDD4跑一趟,查看结果
    在这里插入图片描述
  • 计算RDD5,也会RDD1到RDD2到RDD3到RDD4跑一趟,查看结果
    在这里插入图片描述

3、采用持久化操作

  • 可以在RDD上使用persist()或cache()方法来标记要持久化的RDD(cache()方法实际上底层调用的是persist()方法)。在第一次行动操作时将对数据进行计算,并缓存在节点的内存中。Spark的缓存是容错的:如果缓存的RDD的任何分区丢失,Spark就会按照该RDD原来的转换过程自动重新计算并缓存。
  • 计算到RDD3时,标记持久化
    在这里插入图片描述
  • 计算RDD4,就是基于RDD3缓存的数据开始计算,不用从头到尾跑一趟
    在这里插入图片描述
  • 计算RDD5,就是基于RDD3缓存的数据开始计算,不用从头到尾跑一趟
    在这里插入图片描述

二、存储级别

(一)持久化方法的参数

  • 利用RDD的persist()方法实现持久化,向persist()方法中传入一个StorageLevel对象指定存储级别。每个持久化的RDD都可以使用不同的存储级别存储,默认的存储级别是StorageLevel.MEMORY_ONLY

(二)Spark RDD存储级别表

  • Spark RDD有七种存储级别
    在这里插入图片描述
  • 在Spark的Shuffle操作(例如reduceByKey())中,即使用户没有使用persist()方法,也会自动保存一些中间数据。这样做是为了避免在节点洗牌的过程中失败时重新计算整个输入。如果想多次使用某个RDD,那么强烈建议在该RDD上调用persist()方法。

(三)如何选择存储级别 - 权衡内存使用率和CPU效率

  • 如果RDD存储在内存中不会发生溢出,那么优先使用默认存储级别(MEMORY_ONLY),该级别会最大程度发挥CPU的性能,使在RDD上的操作以最快的速度运行。
  • 如果RDD存储在内存中会发生溢出,那么使用MEMORY_ONLY_SER并选择一个快速序列化库将对象序列化,以节省空间,访问速度仍然相当快。
  • 除非计算RDD的代价非常大,或者该RDD过滤了大量数据,否则不要将溢出的数据写入磁盘,因为重新计算分区的速度可能与从磁盘读取分区一样快。
  • 如果希望在服务器出故障时能够快速恢复,那么可以使用多副本存储级别MEMORY_ONLY_2或MEMORY_AND_DISK_2。该存储级别在数据丢失后允许在RDD上继续运行任务,而不必等待重新计算丢失的分区。其他存储级别在发生数据丢失后,需要重新计算丢失的分区。

(四)查看persist()与cache()方法源码

/**                                                                                           
 * 在第一次行动操作时持久化RDD,并设置存储级别,当RDD从来没有设置过存储级别时才能使用该方法                                           
 */                                                                                          
def persist(newLevel: StorageLevel): this.type = {                                            
  if (isLocallyCheckpointed) {                                                                
    // 如果之前已将该RDD设置为localCheckpoint,就覆盖之前的存储级别                                                
    persist(LocalRDDCheckpointData.transformStorageLevel(newLevel), allowOverride = true)     
  } else {                                                                                    
    persist(newLevel, allowOverride = false)                                                  
  }                                                                                           
}                                                                                             
/**                                                                                           
  * 持久化RDD,使用默认存储级别(MEMORY_ONLY)                                                              
  */                                                                                          
def persist(): this.type = persist(StorageLevel.MEMORY_ONLY)                                  
                                                                                              
/**                                                                                           
  * 持久化RDD,使用默认存储级别(MEMORY_ONLY)                                                              
  */                                                                                          
def cache(): this.type = persist()                                                            
  • 从上述代码可以看出,cache()方法调用了persist()方法的无参方法,两者的默认存储级别都为MEMORY_ONLY,但cache()方法不可更改存储级别,而persist()方法可以通过参数自定义存储级别。

(五)案例演示设置存储级别

  • 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的详细存储信息
    在这里插入图片描述
  • 上述操作说明,调用RDD的persist()方法只是将该RDD标记为持久化,当执行行动操作时才会对标记为持久化的RDD进行持久化操作。
  • 执行以下命令,创建rdd2,并将rdd2持久化到磁盘
    在这里插入图片描述
  • 刷新上述WebUI,发现多了一个MapPartitionsRDD的存储信息,该RDD的存储级别为DISK,持久化的分区为8,完全存储于磁盘中。
    在这里插入图片描述

(三)将RDD从缓存中删除

  • 执行以下命令,将rdd(ParallelCollectionRDD)从缓存中删除
    在这里插入图片描述
  • 刷新上述WebUI,发现只剩下了MapPartitionsRDDParallelCollectionRDD已被移除。
    在这里插入图片描述
  • Spark会自动监视每个节点上的缓存使用情况,并以最近最少使用的方式从缓存中删除旧的分区数据。如果希望手动删除RDD,而不是等待该RDD被Spark自动从缓存中删除,那么可以使用RDD的unpersist()方法。

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

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

相关文章

docker使用集锦

docker简介 docker是一个软件,作用是在任意安装docker软件的系统上虚拟一个容器,用户可以在容器上构建任何自定义环境。 容器与虚拟机的区别在于,虚拟机需要对硬件也虚拟化,分配给虚拟机一定的资源,包括网卡&#xf…

SpringBoot热部署插件原理分析及实战演练

目录 1、关于热部署(Hot Deploy)产生的背景 1)热部署出现前 2)热部署出现后 2、spring-boot-devtools插件原理 1)解决变更文件自动加载到JVM中 2)spring-boot-devtools重启速度比手动重启快 3、关于…

最优化理论(一)Fibonacci法(python实现)

最优化理论之Fibonacci法(python实现) 纯纯干货 刚过完五一假期,又要回归到课程多还要兼顾每天考研复习的生活的日常了,这不,最优化理论课程又需要编写一些代码,鉴于网上基于python实现的系列算法很杂很散(基本没有&…

juc--三大接口

文章目录 juc一、为什么会有juc二、juc--三大接口1.lock2.condition3.ReadWriteLock 二、juc--的默认实现类1.ReentrantLock--lock的默认实现类公平锁,非公平锁 2. ReentrantReadWriteLock读写锁--ReadWriteLock的默认实现类读写锁和排它锁 总结 juc juc: java.util.concurren…

IT行业比较吃香的技能有哪些?

前言 在互联网IT行业中,虽然只有短短几十年时间,但是技术革新一直都在,而且各类前沿技术层出不穷,不断迭代和创新。作为一个程序员,在互联网行业竞争很激烈的当下,更应该通过学习来应对日新月异的前沿技术。…

【IDEA Sprintboot】简单入门:整合SpringSecurity依赖、整合Thymeleaf框架

目录: 1、【IDEA】简单入门:请求数据库表数据_水w的博客-CSDN博客 目录 三、 1、整合SpringSecurity依赖 2、整合Thymeleaf框架 解决css样式等静态资源访问不到的问题 三、 1、整合SpringSecurity依赖 Spring Security是一个能够为基于Spring的企业…

正则表达式学习贴

1. 前言 1.1 为什么要学习正则表达式 1.1.1 极速体验正则表达式威力 /*** 体验正则表达式的威力,给我们文本处理带来哪些便利*/ public class Regexp_ {public static void main(String[] args) {//假定,编写了爬虫,从百度页面得到如下文本…

网络计算模式复习(二)

网格 由于B/S架构管理软件只安装在服务器端上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器&…

李沐深度学习环境安装(包括pytorch和d2l)

李沐深度学习环境安装(包括pytorch和d2l) 目录一、安装Anaconda3二、安装GPU版本的pytorch三、使用jupyter notebook运行李沐书籍的源码 目录 一、安装Anaconda3 进入Anaconda官网下载:https://www.anaconda.com/distribution/ 安装细节不在…

小程序上车,车载小程序的信息安全是否可靠?

随着智能交通和车联网技术的快速发展,越来越多的车载应用程序(APP)进入人们的视野,从而推动了车载业务生态的不断发展。然而,车载应用程序的安全问题也引起了人们的广泛关注。为此,小程序容器技术作为一种有…

centos7.5 从0-1安装mysql以及基本的增删改查

系列文章目录 文章目录 系列文章目录前言一、mysql安装二、mysql客户端操作总结 前言 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 什么是…

Kubernetes(K8S)的基础概念

目录 1.Kubernetes介绍 1. 什么是Kubernetes? 2.为什么要用K8S? 3.k8s的特性 2.k8s集群架构与组件 1.Master组件 2.配置存储中心 — etcd 3.Node组件 3.Kubernetes 核心概念 1.Pod 2.Pod 控制器 3.Label 4.Label 选择器(Label selector&am…

21.面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码:面向削峰填谷的电动汽车多目标优化调度策略 关键词:电动汽车 削峰填谷 多目标 充放电优化 参考文档:店主自己整理的说明文档,公式、约束、数据齐全,可联系我查看 仿真平台:MATLAB YA…

java单链表反转

我们都知道在 Java中,如果要创建一个对象,我们可以通过创建一个空的对象来实现。如果创建一个空的对象,我们会很容易实现,但是如果创建一个链表的话,我们就需要利用到反链表技术。 在 Java中,反转链表有两种…

解锁音视频开发技巧,投身新时代的互联网浪潮

前言 音视频应用范围广泛,涵盖了许多不同的领域和行业。下面列出一些常见的音视频应用: 通信:音视频通讯是当今普遍使用的一种方式,包括互联网电话、视频会议、视频聊天应用等。娱乐:音视频内容在娱乐行业中应用广泛…

五一去淄博只撸串?用VR云游看看隔壁这个的宝藏地

卷饼、小葱、烤肉串…… 最近的淄博真是火出圈了 全网刷屏 吸引了全国各地网友的味蕾 有多少人铆足了劲 准备趁着五一小长假“进淄赶烤”的? 五一山东行, 当然不能只“炫”一顿烧烤 美食美景不止淄博 在淄博隔壁,还有这么一座宝藏城市…

Springboot +Flowable,设置任务处理人的四种方式(二)

一.简介 上一篇文章介绍了学习UserTask 设置用户的两种方式,这篇下UserTask 设置用户的其他方式。 流程图还是之前那个: 二.第三种:通过监听器设置 我可以通过监听器来设置任务的处理人。具体方式如下: 首先我们在绘制流程图…

你真的会搭建框架吗?自动化测试框架精细整理,框架看这一篇就够了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 无论是在自动化测…

Python文件和操作系统基础

文章和代码等已经归档至【Github仓库:https://github.com/timerring/dive-into-AI 】或者【AIShareLab】回复 python数据分析 也可获取。 文章目录 文件和操作系统文件的字节和Unicode 文件和操作系统 代码示例大多使用诸如 pandas.read_csv 之类的高级工具将磁盘上…

板卡设计资料原理图:536-基于FMC接口的XCZU7EV通用PCIe卡主控计算卡工业控制卡PCIe卡FMC接口卡

基于FMC接口的XCZU7EV 通用PCIe卡 一、板卡简介 基于3U PXIe的ZU11EG/ZU7EG/ZU7EV的通用 ,实现FMC的数据接口和主控计算,广泛应用于工业控制,检测,视觉处理。支持工业级温度工作。 二、主要功能 1、板卡核心芯…