5.1.4.8 RDD 持久化

news2024/11/24 13:09:03

1) RDD Cache 缓存

  • RDD 通过 Cache 或者 Persist 方法将前面的计算结果缓存,默认情况下会把数据以缓存
    在 JVM 的堆内存中。但是并不是这两个方法被调用时立即缓存,而是触发后面的 action 算
    子时,该 RDD 将会被缓存在计算节点的内存中,并供后面重用。
// cache 操作会增加血缘关系,不改变原有的血缘关系
println(wordToOneRdd.toDebugString)

// 数据缓存。
wordToOneRdd.cache()


// 可以更改存储级别
//mapRdd.persist(StorageLevel.MEMORY_AND_DISK_2)

存储级别

object StorageLevel {
	 val NONE = new StorageLevel(false, false, false, false)
	 val DISK_ONLY = new StorageLevel(true, false, false, false)
	 val DISK_ONLY_2 = new StorageLevel(true, false, false, false, 2)
	 val MEMORY_ONLY = new StorageLevel(false, true, false, true)
	 val MEMORY_ONLY_2 = new StorageLevel(false, true, false, true, 2)
	 val MEMORY_ONLY_SER = new StorageLevel(false, true, false, false)
	 val MEMORY_ONLY_SER_2 = new StorageLevel(false, true, false, false, 2)
	 val MEMORY_AND_DISK = new StorageLevel(true, true, false, true)
	 val MEMORY_AND_DISK_2 = new StorageLevel(true, true, false, true, 2)
	 val MEMORY_AND_DISK_SER = new StorageLevel(true, true, false, false)
	 val MEMORY_AND_DISK_SER_2 = new StorageLevel(true, true, false, false, 2)
	 val OFF_HEAP = new StorageLevel(true, true, true, false, 1)

在这里插入图片描述

  • 缓存有可能丢失,或者存储于内存的数据由于内存不足而被删除,RDD 的缓存容错机
    制保证了即使缓存丢失也能保证计算的正确执行。通过基于 RDD 的一系列转换,丢失的数
    据会被重算,由于 RDD 的各个 Partition 是相对独立的,因此只需要计算丢失的部分即可,
    并不需要重算全部 Partition。
  • Spark 会自动对一些 Shuffle 操作的中间数据做持久化操作(比如:reduceByKey)。这样
    做的目的是为了当一个节点 Shuffle 失败了避免重新计算整个输入。但是,在实际使用的时
    候,如果想重用数据,仍然建议调用 persist 或 cache。

2) RDD CheckPoint 检查点

所谓的检查点其实就是通过将 RDD 中间结果写入磁盘
由于血缘依赖过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果检查点
之后有节点出现问题,可以从检查点开始重做血缘,减少了开销。
对 RDD 进行 checkpoint 操作并不会马上被执行,必须执行 Action 操作才能触发。

// 设置检查点路径
sc.setCheckpointDir("./checkpoint1")

// 创建一个 RDD,读取指定位置文件:hello atguigu atguigu
val lineRdd: RDD[String] = sc.textFile("input/1.txt")

// 业务逻辑
val wordRdd: RDD[String] = lineRdd.flatMap(line => line.split(" "))
val wordToOneRdd: RDD[(String, Long)] = wordRdd.map {
    word => {
		 (word, System.currentTimeMillis())
		 }
}

// 增加缓存,避免再重新跑一个 job 做 checkpoint
wordToOneRdd.cache()

// 数据检查点:针对 wordToOneRdd 做检查点计算
wordToOneRdd.checkpoint()

// 触发执行逻辑
wordToOneRdd.collect().foreach(println)

3) 缓存和检查点区别

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

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

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

缓存(Caching)和检查点(Checkpointing)是在数据处理和计算中常见的技术,它们有以下区别:

  1. 目的和使用场景:

    • 缓存:缓存是将计算过程中的中间结果存储在内存或其他高速存储设备中,以便在后续的计算中重复使用。它主要用于优化计算性能,减少重复计算的开销。
    • 检查点:检查点是将整个数据集的状态存储在持久化存储介质中,以便在系统故障或需要恢复时能够快速恢复数据。它主要用于提供容错性和可恢复性。
  2. 存储位置:

    • 缓存:缓存通常将数据存储在内存或其他高速存储设备中,以便快速访问。
    • 检查点:检查点将数据存储在持久化存储介质(如磁盘或分布式文件系统)中,以确保数据的持久性和可靠性。
  3. 存储内容:

    • 缓存:缓存通常存储计算过程中的中间结果或经常访问的数据,以便在后续的计算中重复使用。
    • 检查点:检查点存储整个数据集的状态,包括所有的数据和计算中间结果。
  4. 开销和效率:

    • 缓存:缓存可以减少重复计算的开销,但需要消耗额外的内存或存储资源。对于大规模数据或计算密集型任务,过多的缓存可能导致内存压力或性能问题。
    • 检查点:检查点需要将整个数据集写入磁盘或持久化存储介质,因此可能会有一定的存储和IO开销。对于大规模数据集或频繁的检查点操作,需要考虑存储和IO资源的管理和性能优化。

总的来说,缓存主要用于优化计算性能和减少重复计算,而检查点主要用于提供容错性和数据恢复能力。在实际应用中,可以根据具体的场景和需求来选择使用缓存还是检查点,或者两者结合使用,以实现更好的性能和可靠性。

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

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

相关文章

应用案例 | 使用tManager ControlLogix模块优化食品生产研发流程

探索tManager在食品制造应用中如何创建实时时间戳的过程数据,从而改善产品的开发流程。 一 背景 为了在当今以数据驱动的制造环境中取得成功,车间控制系统必须能够与企业计算系统进行信息交换。对此,事务管理器,像Softing的tMana…

银河麒麟服务器v10 sp1 安装 nginx

首先查询是否安装: rootxxx-pc:~# ps -ef |grep nginx 或 rootxzx-pc:~# dpkg -list|grep nginx 如果安装请先卸载,或者直接使用,以下步骤你就可以忽略了,软件包的卸载方法: 1、APT方式 (1&#xff09…

牛客网Verilog刷题——VL40

牛客网Verilog刷题——VL40 题目答案 题目 设计一个同时输出7分频的时钟分频器,占空比要求为50%。注意rst为低电平复位。   信号示意图如下: 波形示意图如下。 输入输出描述: 信号类型输入/输出位宽描述clk_inwireIntput1系统时钟信号rs…

node.js分词搜索

背景 最近有个需求是要实现类似【搜索引擎】的功能,用户输入关键字,后台实时推送相关数据。 思路 先仿Elasticsearch做一个简单的分词效果,然后根据分词逐一数据库查询,然后以结果【出现次数由多到少】的顺序展示数据。 实现…

C++多线程学习(三、线程处理函数【get_id、sleep_for、yield、sleep_until】)

目录 线程处理函数 1.获取线程id:get_id 2.延时函数:sleep_for 3.放弃执行函数,调用另一个线程:yield 4.让当前线程休眠直到指定的时间点:sleep_until 线程处理函数 1.获取线程id:get_id #include&l…

C#基础笔记

1.1、数据类型 值类型 需得到一个类型或一个变量在特定平台上的准确尺寸,可以使用 sizeof 方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。 using System;namespace DataTypeApplication {class Program{static void Main(string[] args){…

简单而高效的文件管理系统

随着数字化时代的不断发展,人们在日常生活和工作中处理的文件越来越多。如何有效地管理这些文件成为了一个亟待解决的问题。基于云的文件管理系统可以帮助用户更快地查找、组织和共享文件,提高工作效率。本文将介绍如何打造简单而高效的文件管理系统。 …

netty学习(2):多个客户端与服务器通信

1. 基于前面一节netty学习(1):1个客户端与服务器通信 只需要把服务器的handler改造一下即可,通过ChannelGroup 找到所有的客户端channel,发送消息即可。 package server;import io.netty.channel.*; import io.netty.channel.gr…

群晖GitLab修改clone(克隆)地址

通过群晖的Docker(ContainerManager)配置好GitLab后,每次clone代码总要修改前面的地址,因此作者找到了修改的办法,实属不易,请给个关注! 给出我的群晖配置gitlab的设置,如图1。 图1 Docker中GitLab的配置 按…

生成式AI筑建基石,亚马逊云科技以强大应用能力和辐射范围加快技术传播速度

众所周知,要把大模型转化为生产力,AI模型、算力和数据会是难以逾越的门槛。新的目标已经出现,我们是否有了足够强大的AI基础设施?在6月28日上海举行的峰会上,亚马逊云科技展示了这样的能力。 从掀起AI画图热潮的Stabil…

禁用USB接口的几个办法

本文为大家提供了四个禁用电脑USB接口的方法,如果企业用户建议使用方法三,方法三可以批量对公司内部所有电脑的usb接口进行禁用。 方法一:使用设备管理器禁用USB接口 步骤1:打开设备管理器 首先,我们需要打开设备管理…

玩转smardaten | 速来围观CSDN万粉博主如何零代码开发学生管理系统?

编者荐语: “开发软件必须写代码吗?有没有真正不写代码的快速开发工具?”这是CSDN测试开发领域的万粉博主曲鸟一直思考的问题。今年5月底接触到smardaten,仅用3天自学配置,开发出一款学生管理系统。不得不说&#xff…

python自动化测试 - 自动化框架及工具

1 概述 手续的关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化接口测试性价比最高接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本文选择的测试语言是 python 脚本语言。由于其官…

CentOS8安装docker容器

一、yum包更新到最新 [rootnginx /]# sudo yum update 若是出现以下异常; 处理: 1.首先,进入到 yum 的 repos 目录 [rootnginx /]# cd /etc/yum.repos.d/2.更新一下源。修改 centos 文件内容 [rootnginx yum.repos.d]# sed -i s/mirrorlist/#mirrorlist/…

Vue2+3入门到实战

作为IT技术相关行业不可或缺的岗位之一,前端开发工程师就业前途广阔,一直是很多同学心中转行的首选行业。但很多人还没开始,便被一系列问题难倒了,比如:前端该如何入门?路线图是怎样的?想要找到…

网络编程—— IP地址 + 端口号 +TCP/IP协议 + 协议分层的封装与应用

文章目录 前言一、网络发展各阶段二、网络通信的三大要素1.IP地址2.端口号3.网络协议 三、TCP/IP五层网络模型各层级的用处网络设备所在分层 四、封装和分用封装分用网络传输的实际情况 总结 前言 本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各…

如何提升你的小程序开发流程:实用的建议和技巧

随着微信小程序开发的兴起,越来越多的人想要开发自己的微信小程序,那么,如何提升你的微信小程序开发流程呢? 如果你还没有自己的小程序,那你现在就应该开始着手准备了。如果你已经有了自己的小程序,那么&a…

数字游牧民,连开会都如此“高科技”

你知道“数字游民”吗?是指无须到点上下班,旅居在悠闲惬意的海岛或乡村,通过互联网就能完成工作的群体,这样的工作模式便称作“数字游牧”。听起来很像社畜们的“梦中情job”,是近几年来全球流行的新型生活方式。 在疫…

学生体测的人体运动检测的mediapipe技术怎么实现?

Mediapipe是一个开源的跨平台框架,用于构建实时多媒体处理应用程序。它提供了一系列的预训练模型和工具,其中包括人体姿势估计模型,可以用于人体运动检测。 要使用Mediapipe进行人体运动检测,可以按照以下步骤进行: …

如何在多个 Linux 服务器上运行多个命令

动动发财的小手,点个赞吧! 如果你正在管理多台 Linux 服务器,并且你想在所有 Linux 服务器上运行多个命令,但你不知道该怎么做。不用担心,在这个简单的服务器管理指南[1]中,我们将向您展示如何在多个 Linux…