一文看懂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,一经查实,立即删除!

相关文章

PHP调用调用API接口的方法及实现

随着互联网、云计算和大数据时代的到来,越来越多的应用程序需要调用第三方的API接口来获取数据,实现数据互通和协同工作。PHP作为一种常用的服务器端语言,也可以通过调用API接口来实现不同系统的数据交互和整合。本文将介绍PHP调用电商API接口…

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 ,我们本篇重点看下…

MacOS设置JAVA_HOME环境变量

首先先查看一下,系统当前使用的java是谁,可以使用/usr/libexec/java_home命令 % /usr/libexec/java_home /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home检查一下这个路径下的文件,发现这是一个jre的目录。加上-V参数看…

Redis篇---第二篇

系列文章目录 文章目录 系列文章目录一、为什么 使用 Redis 而不是用 Memcache 呢?二、为什么 Redis 单线程模型效率也能那么高?三、说说 Redis 的线程模型一、为什么 使用 Redis 而不是用 Memcache 呢? 这时候肯定想到的就是做一个 Memcache 与 Redis 区别。 Redis 和 Mem…

移动机器人路径规划(二)--- 图搜索基础,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如何在娱乐与启发之间取得平衡,以促进心灵成长和积极影响。 娱…

利用curl测试WSS连接的建立

记录下: curl -vvv --include --no-buffer \ --header "Connection: Upgrade" \ --header "Upgrade: websocket" \ --header "Host: transcribestreaming.us-east-1.amazonaws.com:8443" \ --header "Origin: http://localhost…

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本身是一个云管理平台,它本身并不提供虚拟化功能,而是依赖…

Mac环境配置的相关知识

Mac中配置环境的三个途径: 1.open/vim /etc/profile (建议不修改这个文件)全局(公有)配置,不管是哪个用户,登录时都会读取该文件(一般在这个文件中添加系统级环境变量) 2./etc/bashrc全局(公有)配置,bash shell执行时&#xff0…

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

昨日,两市股指盘中轰动上扬,深成指、创业板指一度涨超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&#…

潜力无限:深入探索 gRPC 的奇妙世界

🎏:你只管努力,剩下的交给时间 🏠 :小破站 潜力无限:深入探索 gRPC 的奇妙世界 前言第一:什么是gRPC1. 什么是 gRPC?2. gRPC 的定义与背景3. RPC(Remote Procedure Call&…

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注意&#…