5.RDD持久化

news2024/11/27 16:49:46

概述

今日目标:

  • RDD 持久化
    • RDD持久化原理
    • RDD持久化策略
    • 如何选择RDD持久化策略
    • 案例

相关文章如下:

  • spark官网地址
  • RDD编程指南

RDD 持久化

RDD持久化原理

Spark中最重要的功能之一是跨操作在内存中持久化(或缓存)数据集。当持久化RDD时,每个节点将其计算的任何分区存储在内存中,针对一个RDD反复执行多个操作的场景,就只需要对RDD计算一次即可。这使得在接下来的数据处理中速度更快(通常超过10倍)。

正常情况下,RDD 的数据使用过后,内存中是不会一直保存的。

例如以下的操作,针对mapRDD需要多次使用

val dataRDD = sc.parallelize(Array(1,2,3,4))
val mapRDD = dataRDD.map(...)
mapRDD.foreach(...)
mapRDD.saveAsTextFile(...)
mapRDD.collect()

合理使用 RDD 持久化,在某些场景下,对 Spark 应用程序的性能有很大的提升,特别是对于迭代式算法快速交互应用来说,RDD 持久化,是非常的重要。

迭代式算法:迭代算法也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。

要持久化一个 RDD ,只需要调用它的 cache()persist() 方法就可以了。

cache()persist()的区别在于:
cache()persist()的一种简化方式,cache()的底层就是调用的persist()的无参版本,也就是调用persist(MEMORY_ONLY),将数据持久化到内存中。

如果需要从内存中清除缓存,那么可以使用unpersist()方法。

RDD持久化策略

下面来看一下目前 Spark 支持的一些持久化策略

策略介绍
MEMORY_ONLY以非序列化的方式持久化在JVM内存中
MEMORY_AND_DISK同上,但是当某些partition无法存储在内存中时,会持久化到磁盘中
MEMORY_ONLY_SERMEMORY_ONLY,但是会序列化
MEMORY_AND_DISK_SERMEMORY_AND_DSK,但是会序列化
DISK_ONLY以非序列化的方式完全存储到磁盘上
MEMORY_ONLY_2、MEMORY_AND_DISK_2等尾部加了2的持久化级别,表示会将持久化数据复制一份,保存到其他节点

补充说明:

  • MEMORY_ONLY:以非序列化的Java对象的方式持久化在JVM内存中。如果内存无法完全存储RDD所有的partition,那么那些没有持久化的partition就会在下一次需要使用它的时候,重新被计算。

  • MEMORY_AND_DISK:当某些partition无法存储在内存中时,会持久化到磁盘中。下次需要使用这些partition时,需要从磁盘上读取,不需要重新计算

  • MEMORY_ONLY_SER:同MEMORY_ONLY,但是会使用Java的序列化方式,将Java对象序列化后进行持久化。可以减少内存开销,但是在使用的时候需要进行反序列化,因此会增加CPU开销。

  • MEMORY_AND_DISK_SER:同MEMORY_AND_DSK。但是会使用序列化方式持久化Java对象。

  • DISK_ONLY:使用非序列化Java对象的方式持久化,完全存储到磁盘上。

  • MEMORY_ONLY_2、MEMORY_AND_DISK_2等:如果是尾部加了2的持久化级别,表示会将持久化数据复制一份,保存到其它节点,从而在数据丢失时,不需要重新计算,只需要使用备份数据即可。

如何选择RDD持久化策略

Spark提供了多种持久化级别,主要是为了在CPU内存消耗之间进行取舍。
下面是一些通用的持久化级别的选择建议:

  • 优先使用MEMORY_ONLY,纯内存速度最快,而且没有序列化不需要消耗CPU进行反序列化操作,缺点就是比较耗内存
  • MEMORY_ONLY_SER,将数据进行序列化存储,纯内存操作还是非常快,只是在使用的时候需要消耗CPU进行反序列化

注意:
如果需要进行数据的快速失败恢复,那么就选择带后缀为_2的策略,进行数据的备份,这样在失败时,就不需要重新计算了
能不使用DISK相关的策略,就不要使用,因为有的时候,从磁盘读取数据,还不如重新计算一次。

案例

代码如下:

object PersistRDDScala {
  def main(args: Array[String]): Unit = {
    var path = "/Users/hyl/Desktop/fun/sts/spark-demo/hello.txt"
    if (args.length == 1) {
      path = args(0)
    }
    val conf = new SparkConf()
    conf
      // 设置任务名称
      .setAppName("WordCount")
      // local 表示本地运行
      .setMaster("local")
    val linesRDD = new SparkContext(conf).textFile(path)
    var start_time = System.currentTimeMillis()
    linesRDD.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).foreach(println _)
    var end_time = System.currentTimeMillis()
    println("第一次耗时:" + (end_time - start_time))

    start_time = System.currentTimeMillis()
    linesRDD.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).foreach(println _)
    end_time = System.currentTimeMillis()
    println("第二次耗时:" + (end_time - start_time))
  }
}

在这里插入图片描述
在这里插入图片描述
RDD 持久化代码如下:

val linesRDD = new SparkContext(conf).textFile(path).cache()

在这里插入图片描述
在这里插入图片描述
性能提升不明显,那是因为计算的数据量不够大,生产中,动则过亿数据的复杂统计,如果能合理使用持久化,会获取非常不错的性能提升

结束

至此 RDD 持久化就结束了,如有问题,欢迎评论区提问。

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

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

相关文章

Make.com实现多个APP应用的自动化的入门指南

Make.com是一款基于云的自动化平台,可帮助用户将多个应用程序连接在一起,并通过设置自动化流程来简化日常任务。Make.com提供丰富的API集成,支持连接各种流行的应用程序,包括社交媒体、电子商务、CRM等。 使用Make.com实现多个AP…

AM@点与点集的关系@n维空间邻域

文章目录 abstract坐标平面平面点集 平面邻域利用邻域描述点与点集的关系聚点点集分类 n n n维空间基础概念线性运算和空间概念 空间中的两点距离 n n n维空间中的变元极限 n n n维空间内的邻域 abstract 坐标平面和平面点集, n n n维空间点集点与点集的关系n维空间及其邻域 …

python用cv2画图(line, rectangle, text等)

Python做图像图形研究的时候,通常需要画很多辅助几何形状(比如bounding box等)。基于opencv的几何图形绘制具有易用性,而且天然能和numpy数组交互。 本文总结了几种常用的cv2画几何图形的方法,当一个简易的手册使用&a…

【this详解】学习JavaScript的this的使用和原理这一篇就够了,超详细,建议收藏!!!

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:前端js专栏 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进的…

IS200EPSMG1AED 使用Lua创建逻辑脚本或完整程序

IS200EPSMG1AED 使用Lua创建逻辑脚本或完整程序 IS200EPSMG1AED 是一种支持网络的I/O控制器,它执行类似于可编程逻辑控制器(PLC)的控制、逻辑和监控功能。然而,与PLC不同,X-600M是为基于网络的应用而设计的。X-600M可以使用内置网络服务器和…

094基于web+springboot的酒店客房管理系统

欢迎大家关注,一起好好学习,天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本酒店客房管理系统有管理员,用户,会员,清洁人员。管理员功能有个人中心,用户管理&am…

2023年最新CUDA安装教程,看完就会(windows版)。

目录 前言 注意:本教程建立在您已经正确安装了显卡驱动的基础上 第一步,找到对应的CUDA版本 第二步,查看你要安装的pytorch版本对应的cuda版本(如果只需要安装cuda可以跳过) 第二步,下载cuda 第三步,…

PointNet++ 论文阅读

论文链接 PointNet 0. Abstract **背景:**PointNet的设计并未捕捉到度量空间中存在的局部结构,限制了其识别细粒度模式和适用于复杂场景的能力 解决思路: 引入了一种分层神经网络,该网络在输入点集的嵌套分割上递归地应用Poin…

[PHP]禅道项目管理软件ZenTaoPMS源码包 v16.4

禅道项目管理软件ZenTaoPMS一键安装包是一款国产的开源项目管理软件。它集产品管理、项目管理、质量管理、文档管理、组织管理和事务管理于一体,是一款专业的研发项目管理软件,完整地覆盖了项目管理的核心流程。注重实效的管理思想,合理的软件…

C语言,数据结构指针,结构构体操作符 •,->,*的区别,看这篇就够了

在朋友们学习指针和数据结构这一章的时候,对各种操作符云里雾里。当你看到这么文章之后你就会明白了。 一 • 和 ->运算符 • 运算符:是结构变量访问结构体成员时用的操作符 -> 运算符:这是结构体指针访问结构体成员时调用的运算符。 …

GCN火车票识别项目 P1 火车票识别项目介绍 Pytorch LSTM/GCN

从本节开始,我将带大家完成一个深度学习项目:用图卷积神经网络(GCN),实现一个「火车票文字信息提取」的项目,由于火车票上每个节点文字不是等长的,所以还需要添加一个前置的 LSTM 来提取句子特征。 课前说明 1、这是…

VScode + opencv + c++ + win配置教程

准备: 1、下载opencv 2、下载MinGw 3、 3、下载CMake 下载完解压放到一个文件夹里面,便于环境管理,文件夹我重命名了,解压出来文件名不一样正常 环境变量配置 C:\Users\wuxulong\cpp_env\MinGw\mingw64\bin C:\Users\wuxulon…

联想服务器-HTTP boot安装Linux系统

HTTP boot与传统PXE的主要差异 HTTP不再需要使用UDP协议的tftp服务(连接不可靠、不支持大文件)了,只需要dhcp 和http 两个服务即可,支持较稳定的大文件传输。 实验环境 ThinkSystem服务器SR650V2 SR660V2 通过HTTP boot安装Cen…

Android java Handler sendMessage使用Parcelable传递实例化对象,我这里传递Bitmap 图片数据

一、Bundle给我们提供了一个putParcelable(key,value)的方法。专门用于传递实例化对象。 二、我这里传递Bitmap 图片数据,实际使用可以成功传统图像数据。 发送:Bundle bundle new Bundle();bundle.putParcelable("bitmap",bitmap);msg.setD…

YOLO算法改进5【中阶改进篇】:添加SENet注意力机制

SE-Net 是 ImageNet 2017(ImageNet 收官赛)的冠军模型,是由WMW团队发布。具有复杂度低,参数少和计算量小的优点。且SENet 思路很简单,很容易扩展到已有网络结构如 Inception 和 ResNet 中。 我们可以看到,已…

NLP 模型中的偏差和公平性检测

一、说明 近年来,自然语言处理 (NLP) 模型广受欢迎,彻底改变了我们与文本数据交互和分析的方式。这些基于深度学习技术的模型在广泛的应用中表现出了卓越的能力,从聊天机器人和语言翻译到情感分析和文本生成。然而&…

IntelliJ IDEA2023旗舰版和社区版下载安装教程(图解)

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

【C语法学习】14 - 流和文件

文章目录 1 流1.1 概念1.2 优点1.3 分类1.3.1 输入流和输出流1.3.2 标准流和文件流1.3.2.1 标准流1.3.2.2 文件流 1.3.3 文本流和二进制流 4 文件4.1 分类4.2 区别 1 流 1.1 概念 "流"的概念比较抽象,经典C语言书籍《C Primer Plus》中是这样描述的&…

两分钟搞定MySQL安装——极速mysql5.7安装教程

一、下载mysql mysql官网传送带: MySQL :: Download MySQL Community Server 选择好版本后直接下载即可,版本格式为zip格式。 二、安装mysql 1、解压zip安装包 ps:解压缩的路径里面不要出现中文哦! 2、设置配置文件 新建data…

字节10年经验,花3个月熬夜整理的超全面试真题(附答案)

软件测试工程师,和开发工程师相比起来,虽然前期可能不会太深,但是涉及的面还是比较广的。前期面试实习生或者一年左右的岗位,问的也主要是一些基础性的问题比较多。涉及的知识主要有MySQL数据库的使用、Linux操作系统的使用、软件…