一文看懂Spark中Cache和CheckPoint的区别

目录

    • 循循渐进理解
    • 使用Cache或者Persist
    • CheckPoint
    • 缓存和CheckPoint的区别

循循渐进理解

wc.txt数据

hello java
spark hadoop flume kafka
hbase kafka flume hadoop

看下面代码会打印多少条-------------------------(RDD2)

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object Cache {def main(args: Array[String]): Unit = {val sc = new SparkContext(new SparkConf().setMaster("local[4]").setAppName("test"))val rdd1: RDD[String] = sc.textFile("src/main/resources/wc.txt")val rdd2: RDD[String] = rdd1.flatMap(x => {println("-------------------------")x.split(" ")})val rdd3: RDD[(String, Int)] = rdd2.map(x => (x, 1))val rdd4: RDD[Int] = rdd2.map(x => x.size)rdd3.collect()rdd4.collect()Thread.sleep(10000000)}}

正确答案是6条(解释一下wc.txt里面有三行数据,所以flatmap执行一次,会打印三条),因为执行了两个collect()行动算子(action)
大致流程就是这样,因为rdd2没有缓存,所以要执行两次
在这里插入图片描述
在这里插入图片描述

上述的问题
1.一个RDD在多个job中重复使用

  • 问题:每个job执行的时候,该RDD之前处理布置也会宠物中
  • 使用持久化的好处:可以将该RDD数据持久化后,后续job在执行在执行的时候可以直接获取数据计算,不用重读RDD之前数据处理

2.如果一个job依赖链条长

  • 问题:依赖链条太长的时候,如果数据丢失需要重新计算浪费大量的空间
  • 使用持久化的好处:可以直接持久化数据拿来计算,不用重头计算,节省时间

使用Cache或者Persist

看下面代码会打印多少条-------------------------(RDD2) 使用了Cache

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}object Cache {def main(args: Array[String]): Unit = {val sc = new SparkContext(new SparkConf().setMaster("local[4]").setAppName("test"))val rdd1: RDD[String] = sc.textFile("src/main/resources/wc.txt")val rdd2: RDD[String] = rdd1.flatMap(x => {println("-------------------------")x.split(" ")})rdd2.cache()val rdd3: RDD[(String, Int)] = rdd2.map(x => (x, 1))val rdd4: RDD[Int] = rdd2.map(x => x.size)rdd3.collect()rdd4.collect()Thread.sleep(10000000)}}

正确答案是3条
在这里插入图片描述

发现有个绿色点
在这里插入图片描述
发现cache存到memory里面
在这里插入图片描述
RDD的持久化分为
缓存

  • 数据保存位置: task所在主机内存/本地磁盘中

  • 数据保存时机: 在缓存所在第一个Job执行过程中进行数据保存

  • 使用: rdd.cache()/rdd.persist()/rdd.persist(StorageLevel.XXXX)

  • cache与persist的区别

    • cache是只将数据保存在内存中(cache的底层就是persisit())
      在这里插入图片描述

    • persist是可以指定将数据保存在内存/磁盘中
      在这里插入图片描述

  • 常用的存储级别:

    • StorageLevel.MEMORY_ONLY:只将数据保存在内存中,一般用于小数据量场景
    • StorageLevel.MEMORY_AND_DISK:只将数据保存在内存+磁盘中,一般用于大数据量场景

CheckPoint

看下面代码会打印多少条-------------------------(RDD2) 使用了CheckPoint

import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel.MEMORY_AND_DISK
import org.apache.spark.{SparkConf, SparkContext}object Cache {def main(args: Array[String]): Unit = {System.setProperty("HADOOP_USER_NAME", "root")val sc = new SparkContext(new SparkConf().setMaster("local[4]").setAppName("test"))sc.setCheckpointDir("hdfs://hadoop102:8020/sparkss")val rdd1: RDD[String] = sc.textFile("src/main/resources/wc.txt")val rdd2: RDD[String] = rdd1.flatMap(x => {println("-------------------------")x.split(" ")})rdd2.checkpoint()val rdd3: RDD[(String, Int)] = rdd2.map(x => (x, 1))val rdd4: RDD[Int] = rdd2.map(x => x.size)rdd3.collect()rdd4.collect()rdd4.collect()Thread.sleep(10000000)}}

正确答案是6条,无论你有多少个行动算子,他都是6条,因为在checkpoint rdd所在第一个job执行完成之后,会单独触发一个job计算得到rdd数据之后保存。

为什么要用CheckPoint的原因
缓存是将数据保存在主机磁盘/内存中,如果服务器宕机数据丢失,需要重新根据依赖关系计算得到数据,需要花费大量时间,所以需要将数据保存在可靠的存储介质HDFS中,避免后续数据丢失重新计算。

  • 数据保存位置: HDFS
  • 数据保存时机: 在checkpoint rdd所在第一个job执行完成之后,会单独触发一个job计算得到rdd数据之后保存。
  • 使用
    • 1、设置保存数据的目录: sc.setCheckpointDir(path)
    • 2、保存数据: rdd.checkpoint

checkpoint会单独触发一个job执行得到数据之后保存,所以导致数据重复计算,此时可以搭配缓存使用: rdd.cache() + rdd.checkpoint(这样只会产生3条)

import org.apache.spark.rdd.RDD
import org.apache.spark.storage.StorageLevel.MEMORY_AND_DISK
import org.apache.spark.{SparkConf, SparkContext}object Cache {def main(args: Array[String]): Unit = {System.setProperty("HADOOP_USER_NAME", "root")val sc = new SparkContext(new SparkConf().setMaster("local[4]").setAppName("test"))sc.setCheckpointDir("hdfs://hadoop102:8020/sparkss")val rdd1: RDD[String] = sc.textFile("src/main/resources/wc.txt")val rdd2: RDD[String] = rdd1.flatMap(x => {println("-------------------------")x.split(" ")})rdd2.cache()rdd2.checkpoint()val rdd3: RDD[(String, Int)] = rdd2.map(x => (x, 1))val rdd4: RDD[Int] = rdd2.map(x => x.size)rdd3.collect()rdd4.collect()rdd4.collect()Thread.sleep(10000000)}}

缓存和CheckPoint的区别

1.数据保存位置不一样

  • 缓存是将数据保存在task所在主机磁盘/内存中
  • checkpoint是将数据保存到HDFS

2、数据保存时机不一样

  • 缓存是rdd所在第一个Job执行过程中进行数据保存
  • checkpoint是rdd所在第一个job执行完成之后保存

3、依赖关系是否保留不一样

  • 缓存是将数据保存在task所在主机磁盘/内存中,所以服务器宕机数据丢失,需要根据依赖关系重新计算得到数据,所以rdd的依赖不能切除。
  • checkpoint是将数据保存到HDFS,数据不会丢失,所以rdd的依赖后续就用不到了,会切除。

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

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

相关文章

Jmeter- Beanshell语法和常用内置对象(网络整理)

在利用jmeter进行接口测试或者性能测试的时候,我们需要处理一些复杂的请求,此时就需要利用beanshell脚本了,BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法,所以它和java是可以无缝衔接的。beans…

RK3588平台开发系列讲解(摄像头篇)USB摄像头驱动分析

🚀返回专栏总目录 文章目录 一. USB摄像头基本知识1.1 内部逻辑结构1.2 描述符实例解析二. UVC驱动框架2.1、设备枚举过程2.2、数据传输过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 USB摄像头驱动位于 drivers\media\usb\uvc\uvc_driver.c ,我们本篇重点看下…

移动机器人路径规划(二)--- 图搜索基础,Dijkstra,A*,JPS

目录 1 图搜索基础 1.1 机器人规划的配置空间 Configuration Space 1.2 图搜索算法的基本概念 1.3 启发式的搜索算法 Heuristic search 2 A* Dijkstra算法 2.1 Dijkstra算法 2.2 A*&&Weighted A*算法 2.3 A* 算法的工程实践中的应用 3 JPS 1 图搜索基础 1.1…

AD教程 (十六)常用PCB封装的直接调用

AD教程 (十六)常用PCB封装的直接调用 打开已经做好的PCB文件 点击设计,生成PCB库,会自动把PCB里所用到的所有封装,全部自动生成 CtrlA 将所有元器件的封装全部选中(或者只选中所需要的)&#x…

TikTok与心灵成长:娱乐与启发并重

社交媒体已成为我们生活的一部分,其中TikTok以其短视频内容和创新性而闻名。然而,TikTok不仅仅是一个娱乐平台,它还具有潜力成为心灵成长的有力工具。本文将探讨TikTok如何在娱乐与启发之间取得平衡,以促进心灵成长和积极影响。 娱…

IntelliJ IDEA启动一个普通的java web项目的配置

原创/朱季谦 这是我很久以前刚开始用IntelliJ IDEA时记录的笔记,应该是五年前的一篇笔记了。正好赶上最近离职了,可以有比较多的时间把以前的记录整理一下,可以让刚接触到IntelliJ IDEA的童鞋学习如何在IntelliJ IDEA引入一个单机版的jar形式…

蓝桥杯 冒泡排序

冒泡排序的思想 冒泡排序的思想是每次将最大的一下一下移动到最右边,然后将最右边这个确定下来。 再来确定第二大的,再确定第三大的… 对于数组a[n],具体来说,每次确定操作就是从左往右扫描,如果a[i]>a[i1],我们将…

Android问题笔记四十五:解决SeekBar操作thumb周围产生的圆形阴影/灰色阴影/白色圆圈的解决办法

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC 👉关于作者 专…

如何在Ubuntu 23.10部署KVM并创建虚拟机?

正文共:1114 字 21 图,预估阅读时间:2 分钟 我们之前对OpenStack醉过一次简单介绍(什么是OpenStack?),OpenStack本身是一个云管理平台,它本身并不提供虚拟化功能,而是依赖…

第二证券:今日投资前瞻:小米汽车引关注 全球风光有望持续高速发展

昨日,两市股指盘中轰动上扬,深成指、创业板指一度涨超1%。到收盘,沪指涨0.55%报3072.83点,深成指涨0.72%报10077.96点,创业板指涨0.53%报2015.36点,北证50指数涨2.64%;两市算计成交9900亿元&…

JVM——类加载器(JDK8及之前,双亲委派机制)

目录 1.类加载器的分类1.实现方式分类1.虚拟机底层实现2.JDK中默认提供或者自定义 2.类加载器的分类-启动类加载器3.类加载器的分类-Java中的默认类加载器4.类加载器的分类-扩展类加载器5.类加载器的分类-类加载器的继承 2.类加载器的双亲委派机制 类加载器(ClassLo…

MySQL库操作

创建一个数据库,本质就是在Linux下创建一个目录。 当要使用一个库时,先 use 数据库名字。 使用数据库,相当于Linux下的cd命令 附:systen clear mysql内无法直接使用clear,但可以使用systen clear(系统调用…

Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感

利用ANSYS Electronics Desktop,可在综合全面、易于使用的设计平台中集成严格的电磁场分析和系统电路仿真。按需求解器技术让您能集成电磁场仿真器和电路及系统级仿真,以探索完整的系统性能。 HFSS(High Frequency Structure Simulator&#…

Go语言fyne开发桌面应用程序-环境安装

环境安装 参考https://developer.fyne.io/started/#prerequisites网站 之前的文章介绍了如何安装GO语言这里不在叙述 msys2 首先安装msys2,https://www.msys2.org/ 开始菜单打开MSYS2 执行 $ pacman -Syu$ pacman -S git mingw-w64-x86_64-toolchain注意&#…

Ubuntu 20.04 LTS ffmpeg gif mp4 互转 许编译安装ffmpeg ;解决gif转mp4转换后无法播放问题

安装ffmpeg apt install ffmpeg -y gif转mp4 ffmpeg -f gif -i ldh.gif ldh.mp4 故障:生成没报错,但mp4无法播放,体积也不正常 尝试编译安装最新版 sudo apt install -y yasm axel -n 100 https://ffmpeg.org/releases/ffmpeg-6.0.1.tar.x…

世界互联网大会|云轴科技ZStack受邀分享云原生超融合

11月8日至10日“世界互联网大会乌镇峰会”在浙江嘉兴的乌镇开幕,大会的主题为“建设包容、普惠、有韧性的数字世界——携手构建网络空间命运共同体”,全球各界代表就热点焦点问题展开讨论,反映产业各界对互联网发展的前瞻思考,引领…

C++入门第七篇--STL模板--vector模拟实现

前言: 有了前面的string库的介绍,在这里我就不再介绍vector库了,而是直接模拟实现了。 vector库的概念和作用: vector库是针对于数组的数据类型的容器,它有点类似我们曾经实现过的顺序表,你完全可以按照…

051-第三代软件开发-日志容量时间限制

第三代软件开发-日志容量时间限制 文章目录 第三代软件开发-日志容量时间限制项目介绍日志容量时间限制 关键字: Qt、 Qml、 Time、 容量、 大小 项目介绍 欢迎来到我们的 QML & C 项目!这个项目结合了 QML(Qt Meta-Object Language…

【物联网】BDS/GNSS 全星座定位导航模块——ATGM332D-5N

随着科技的不断进步,导航系统已经成为我们日常生活中不可或缺的一部分。传统的导航系统往往只提供基本的地图和路线规划,对于一些特殊需求或个性化定位并不够满足。全星座定位导航模块的出现,为我们带来了全新的导航体验。通过结合星座学说和…

此芯科技加入绿色计算产业联盟,参编绿色计算产业发展白皮书

近日,此芯科技正式加入绿色计算产业联盟(Green Computing Consortium,简称GCC),以Arm架构通用智能CPU芯片及高能效的Arm PC计算解决方案加速构建软硬协同的绿色计算生态体系,推动绿色计算产业加速发展。 继…