大数据技术架构(组件)27——Spark:CacheCheckpoint BroadcastAccumulate

news2025/6/9 13:19:54

2.1.7、Cache&Checkpoint&Broadcast&Accumulate

2.1.7.1、Cache

2.1.7.1.1、Cache原理

RDD是通过iterator进行计算的。当然该方法是内部调用的,不会暴露给用户使用;

1、CacheManager通过BlockManager从Local或者Remote获取数据,然后通过RDD的compute进行计算(这个时候需要考虑是否进行checkpoint),根据数据的读取策略,BlockManager首先会从本地获取,如果读取不到,则从远程获取。

2、在计算的时候,会先看当前的RDD是否进行了Checkpoint,如果进行了CK,就会直接读取,否则进行计算。另外因为RDD需要进行缓存,所以计算结果就会通过BlockManager再次进行持久化。

3、根据持久化策略,要么存储到磁盘,要么存储到内存;如果只是缓存到磁盘中国,就直接使用BlockManager.doPut方法写入(这个时候需要考虑Replication);如果是写入内存,那么会使用MemoryStore.unrollSafely尝试安全将数据保存到内存中,如果内存不够,就会使用一个方法来整理一部分空间。

4、当直接通过RDD的compute进行计算的时候,可能需要考虑checkpoint。

2.1.7.2、Checkpoint

2.1.7.2.0、什么时候需要Checkpoint

1、当计算中有大量的RDD,且本身计算特别复杂且耗时,这个时候需要考虑将计算结果进行持久化

2、需要对曾经计算的结果数据进行复用的时候,可以提升效率

3、当采用persist把数据放到内存或者磁盘时,可能会造成数据丢失

针对以上3种场景,引入了checkpoint来更加可靠持久化数据,可以指定数据放到本地且多副本的方式(生产一般是存储于HDFS);另一方面确保了RDD复用计算的可靠性,最大程度保证数据安全;通过对RDD启动Checkpoint机制来实现容错和高可用。

2.1.7.2.1、Checkpoint原理

RDD在进行计算之前会先看一下是否有checkpoint,如果有则不需要计算,如果没有被持久化,则进行compute

1、通过Sparkcontext.setCheckpointDir方法设置Checkpoint路径。(这里会进行检查,如果程序在集群中运行,但是目录设置的是本地,那么会记录一个警告,然后driver会试图从它的本地文件系统重建RDD的checkpoint检测点,因为checkpoint文件检查点不正确。实际上应该是在Executor机器上,因为计算是发生在Executor端)

2、如果某个RDD需要进行checkpoint,那么就会生成RDDCheckpointData对象,首先会调用doCheckpoint方法,其内部会通过checkpoint方法会标记RDD的检查点,移除所有引用的父RDDS,来截断RDD血统,并保存到对应的目录中。

当RDD上运行过一个Job后,就会触发RDDCheckpointData.doCheckpoint方法,把路径信息广播给所有的Executor,然后其内部会调用runJob来执行当前的RDD的数据写到checkpoint目录中,同时会产生ReliableCheckpointRDD实例,并调用writeRDDToCheckpointDirectory方法进行checkpoint工作

3、在进行RDD的checkpoint时候,它所依赖的所有的RDD都会从计算链条上清空掉。

4、由于checkpoint是懒加载的,必须得有Job的执行,当Job执行完成之后,才会从后往前回溯哪个RDD进行了checkpoint标记,然后对标记过的RDD再启动一个Job执行具体的checkpoint过程。

2.1.7.2.2、Checkpoint Vs Persist Vs Cache

Cache:底层其实调用的就是Persist(StorageLevel.MEMORY_ONLY),即把数据缓存到内存中

Persist:根据配置的StorageLevel存储策略,将数据缓存到内存或者磁盘。

Checkpoint:通常是将数据持久化到HDFS上,主要用于故障恢复容错保障,且根据上面对checkpoint的原理介绍,checkpoint会切断RDD之间的血缘关系,而persist和cache则会保留RDD之间的血缘关系。从另一方面讲Checkpoint保存数据的文件是不会随着应用程序的结束而删除,除非用户手动删除,而persist或cache则会在程序结束后自动删除。

2.1.7.3、Broadcast

2.1.7.3.1、场景

通常是将数据从一个节点上发送到其他节点上,且存储在内存或者磁盘上,所以不适合存放太大的数据,否则会造成网络I/O压力过大。一般用于处理配置文件、通用的DataSet、数据结构等。

Spark2.X版本中目前存在的Broadcast类型仅有TorrentBroadcast(可能会有网络压力),1.6版本还有HttpBroadcast(见SPARK-12588),但其可能会有单点压力。

2.1.7.3.2、原理

首先其在SparkContext初始化的时候会创建SparkEnv,这个时候开始初始化广播相关的类。即入口为:

1、其首先会创建BroadcastManager,内部会初始化TorrentBroadcastFactory,该工厂类用于实例化TorrentBroadcast。

2、当调用sc.broadcast进行广播RDD或者其他数据时,那么底层会调用TorrentBroadcast,并首先将其数据写入到Driver端,底层是通过BlockManager进行操作,并将数据会被分成4MB大小的块,然后将块信息上报到BlockManagerMaster中

3、当Executor端的task需要使用到广播变量值的时候,那么会调用value方法获取。那么底层其实是会先进行判断,如果该Executor是首次获取该值的话,那么会向Driver进行请求,当拿到结果后会写入本地,也会像Driver端操作一样,通过BlockManager进行管理,将数据分块上报到全局的BlockManagerMaster中去;如果不是第一次获取且本地存在,则直接读取本地,否则根据随机洗牌向其他的DataServer(Executor/Driver)获取。

管理及生命周期:底层通过BlockManager管理,由于Spark应用程序可能会存在多个Job,并不是每个Job都需要广播变量,也可能一个Job需要很多广播变量,那么其具体生命周期可以手动指定来销毁。

注意:Broadcast变量是只读的,其主要是为了保障数据一致性。避免了容错、更新顺序逻辑的考虑

2.1.7.4、Accumulate

1、分布式全局只写的数据结构、用于数据的累加。只能在Driver端进行读取

2、累加器更新只在action动作内执行,spark保证每个任务对累加器的更新只应用一次,即重新启动的任务不会更新该值;在transformations转换中,如果重新执行任务或者Stage,那么每个任务的更新可能会执行多次。

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

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

相关文章

网站虚拟主机的流量为什么会受限制?

虚拟主机流量限制是指网站所在的虚拟主机提供商对网站流量的限制,网站的流量超出限制的话将会受到一定影响,从而影响网站的正常运行。那么网站虚拟主机流量为什么会受限制?本文将详细介绍。 一、虚拟主机流量限制的主要原因 1、虚拟主机提供商设置的流量…

SpringBoot/SpringCloudAlibaba(ruoyi)中cron表达式(配置每天指定整点执行)读取配置文件

场景 若依微服务版手把手教你本地搭建环境并运行前后端项目: 若依微服务版手把手教你本地搭建环境并运行前后端项目_霸道流氓气质的博客-CSDN博客 在上面的基础上某业务需要配置cron表达式,该表达式需要指定每天的指定的整点执行, 比如每…

如何借力Alluxio推动大数据产品性能提升与成本优化?

内容简介 随着数字化不断发展,各行各业数据呈现海量增长的趋势。存算分离将存储系统和计算框架拆分为独立的模块,Alluxio作为如今主流云数据编排软件之一,为计算型应用(如 Apache Spark、Presto)和存储系统&#xff0…

buu [网鼎杯 2020 青龙组]boom 1

题目描述: 一个应用程序,打开了是一串要运行的代码: 题目分析: 首先,跟着代码走下1去得到: 对密文进行md5解密,得到:输入后继续跟着代码走下去,得到:好家伙&#xff0…

RabbitMQ 部署指南

RabbitMQ 部署指南RabbitMQ部署指南1.单机部署1.1.下载镜像1.2.安装MQ2.安装DelayExchange插件2.1.下载插件2.2.上传插件2.3.安装插件3.集群部署2.1.集群分类2.2.获取cookie2.3.准备集群配置2.4.启动集群2.5.测试2.5.1.数据共享测试2.5.2.可用性测试4.镜像模式4.1.镜像模式的特…

太酷了,用Python实现一个动态条形图!

大家好,我是小F~说起动态条形图,小F之前推荐过两个Python库,比如「Bar Chart Race」、「Pandas_Alive」,都可以实现。今天就给大家再介绍一个新的Python库「pynimate」,一样可以制作动态条形图,…

JVM调优最全面的成长 :参数详解+垃圾算法+示例展示+类文件到源码+面试问题

目录1.优秀的Java开发者1.1 什么是Java?1.2 编程语言1.3 计算机[硬件]能够懂的语言1.3.1 计算机发展史1.3.2 计算机体系结构1.3.3 计算机处理数据过程1.3.4 机器语言1.3.5 不同厂商的CPU1.3.6 操作系统1.3.7 汇编语言1.3.8 高级语言1.3.9 编译型和解释型1.3.9.1 编译…

内网渗透(十三)之内网信息收集-收集域环境中的基本信息

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

android kotlin 协程(一) 简单入门

android kotlin 协程(一) config: system: macOS android studio: 2022.1.1 Electric Eel gradle: gradle-7.5-bin.zip android build gradle: 7.1.0 Kotlin coroutine core: 1.6.4 前言:最近系统的学习了一遍协程, 计划通过10篇左右blog来记录一下我对协程的理解, 从最简…

视频融合平台EasyCVR集成宇视SDK关闭“按需直播”,一直未拉流是什么原因?

EasyCVR平台不仅能提供丰富的视频能力,还可提供云、边、端分布式海量视频资源的统一管理与运维,从而实现数据采集、处理、汇聚、分析、存储、管理等全环节的视频能力。借助智能分析网关的AI智能检测能力,可实现人脸、人体、车辆、烟火、物体、…

(十五)双边滤波Bilateral Filter

文章目录mathjax: true1.高斯滤波1.1 理论1.2 示例2.双边滤波(Bilateral Filter)2.1 理论基础2.2 OpenCV bilateralFilter函数参考资料欢迎访问个人网络日志🌹🌹知行空间🌹🌹 title: 3.双边滤波BilateralFi…

微信小程序 java基于Android老年人智慧服务平台-

目录 1绪论 4 1.1项目研究的背景 4 1.2开发意义 4 1.3项目研究内容 4 1.4论文结构 4 2开发技术介绍 6 2.1B/S架构 6 2.2 Android平台 6 2.3 Java语言简介 6 2.4 MySQL 介绍 7 2.5 MySQL环境配置 8 2.6 SSM框架 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性…

【图像异常检测】 Anomalib

原文: A practical guide to image-based anomaly detection using Anomalib 1. 简介 在工业生产中,质量保证是一个很重要的话题, 因此在生产中细小的缺陷需要被可靠的检出。工业异常检出旨在从正常的样本中检测异常的、有缺陷的情况。工业…

构建工具tsup入门第四部分

🎄Hi~ 大家好,我是小鑫同学,一位长期从事前端开发的编程爱好者,我将使用更为实用的案例输出更多的编程知识,同时我信奉分享是成长的唯一捷径,在这里也希望我的每一篇文章都能成为你技术落地的参考~ 目录&am…

哈夫曼树、带权路径长度、前缀编码 的概念

文章目录一、基本概念1.1带权路径长度(WPL)1.2哈夫曼树二、哈夫曼树的构造三、哈夫曼树的应用3.1哈夫曼编码与前缀编码一、基本概念 1.1带权路径长度(WPL) 路径长度: 经历的边数 结点的带权路径长度: 从树…

创建线程的三种模式

进程,是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。 线程,是进程的子任务,是CPU调度和分派的基本单位,实现了进程内部的并发。 线程在进程下运行。 进程之间不会影响…

从0到1一步一步玩转openEuler--09 openEuler基础配置--设置日期和时间

文章目录9 设置日期和时间9.1 使用timedatectl命令设置9.1.1 显示日期和时间9.1.2 通过远程服务器进行时间同步9.1.3 修改日期9.1.4 修改时间9.1.5 修改时区9.2 使用date命令设置9.2.1 显示当前的日期和时间9.2.2 修改时间9.2.3 修改日期9.3 使用hwclock命令设置9.3.1 硬件时钟…

QT之OpenGL深度测试

QT之OpenGL深度测试1. 深度测试概述1. 1 提前深度测试1.2 深度测试相关函数2. 深度测试精度2.1 深度冲突3. Demo4. 参考1. 深度测试概述 在OpenGL中深度测试(Depth Testing)是关闭的,此时在渲染图形时会产生一种现象后渲染的会把最先渲染的遮挡住。而在启用深度测试…

浏览器的底层运行机制

一、复习 1.进程和线程 进程:指一个程序(或浏览器打开一个页面就是开辟一个进程)* 线程:程序中具体执行任务的一个进程中可能包含一到多个线程!!* 单线程:同时只能处理一件事,上一件事处理完,…

ASEMI三相整流模块MDS55-16特征,MDS55-16应用

编辑-Z ASEMI三相整流模块MDS55-16参数: 型号:MDS55-16 最大重复峰值反向电压(VRRM):1600V 最大RMS电桥输入电压(VRMS):1700V 最大平均正向整流输出电流(IF&#xf…