spark 广播变量broadcast

news2024/12/23 13:15:11

broadcast使用如下图,可以看到创建broadcast是val barr1 = sc.broadcast(arr1),使用broadcast是barr1.value

创建broadcast是使用的broadcastManager。

BroadcastManager

cachedValues变量是map结构,key是broadcastId,强引用,GC的时候不会回收,value是broadcast值,弱引用,GC的时候会进行回收。
创建新的broadcast值是生成新的broadcastId,再调用broadcastFactory的方法。

TorrentBroadcastFactory

创建新的broadcast值,就是生成了TorrentBroadcast对象。

TorrentBroadcast

_value是一个缓存,但是是软引用,会被GC回收。
numBlocks是broadcast写入block对应的数量,调用了writeBlocks将obj写入block。

writeBlocks

这个方法是在driver端运行的。首先将value缓存到driver的本地(MEMORY_AND_DISK),在driver运行的task可以直接读取这个值。再将value序列化、压缩后分块(默认4M),将分好的块也缓存下来(MEMORY_AND_DISK_SER),但是tellMaster=true,意思是将缓存结果通知给blockManagerMaster。

value

在task中获取broadcast值,使用value方法。
value方法是调用的getValue方法

getValue

优先从TorrentBroadcast对象的缓存_value中获取。如果取不到就调用readBroadcastBlock方法获取,得到的结果缓存到_value中。

readBroadcastBlock

先根据broadcastId从broadcastManager的cache中获取,如果获取不到就先读取本地block来获取值,返回的值缓存到broadcastManager的cache。

本地没获取到,就调用readBlocks从远端获取(driver或者其它executor)。获取到的结果缓存到本地block,同时缓存到broadcastManager的cache中

readBlocks

broadcast是分块进行存储的,所以也是分块进行获取。
根据pieceId优先从本地进行读取,如果没有值的话,就调用getRemoteBytes从远端进行读取,得到的piece值缓存到本地,并通知给blockManagerMaster,方便别的executor来获取。最后返回放有所有piece结果的blocks。

broadcast存储

分成两部分进行存储。整体存储是提供给运行在本地的task来直接获取,分piece存储是为了提供给远端task获取。
如果只有整体存储没有分块存储的话,一开始broadcast值只在driver端存储。task启动后,对应的executor都会从driver读取,这样就会有driver的io瓶颈。加上分块存储后,一开始broadcast值只在driver端存储,executor向driver请求piece(请求piece的顺序是打乱的),请求数据量不大,而且executor获取到piece后也会缓存到本地,提供给别的executor来请求,这样就将driver的压力分散到各个executor。
如果只有分块存储没有整体存储的话,本地读取也要按照piece读取再合并,效率比较低,因为一个executor上会运行很多task任务。其实我觉得去掉整体存储影响不大,因为广播变量值在内存还有两层缓存。
image.png

读取broadcast

image.png

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

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

相关文章

初识C++|模板初阶

🍬 mooridy-CSDN博客 🧁C专栏(更新中!) 目录 🍉1. 泛型编程 🍉2. 函数模板 🥝2.1 函数模板概念 🥝2.2 函数模板格式 🥝2.3 函数模板的原理 &#x1f95…

java题目之数字加密以及如何解密

public class Main6 {public static void main(String[] args) {// 某系统的数字密码&#xff08;大于0&#xff09;&#xff0c;比如1983&#xff0c;采用加密方式进行传输//定义了一个静态数组int []arr{1,9,8,3};//1.加密//先给每位数加上5for (int i 0; i <arr.length …

1997. 孤独的素数(结果有一点问题,希望能一起求解)

问题描述 在一个 &#x1d45b; 行 &#x1d45a;列的矩阵王国中&#xff0c;生活着一些整数&#xff0c;其中一些是素数&#xff0c;一些不是素数。如果一个素数的上下左右、左上、右上、左下、右下相邻的数中都没有素数&#xff0c;我们就认为这是一个孤独的素数。 比如&am…

Spring Boot + Spring Cloud 入门

运行配置 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.activetest --my1.age32 --debugtrue "D:\Program Files\Redis\redis-server.exe" D:\Program Files\Redis\redis.windows.conf "D:\Program Files\Redis\redis-cli.exe" &q…

【零基础必看的前端教程】——JavaScript(四)类型转换

欢迎大家打开前端的新篇章——JavaScript&#xff0c;JavaScript与HTML、CSS合称为前端三大件&#xff0c;JavaScript是前端的重中之重&#xff0c;小洪将继续以零基础视角&#xff0c;带你循序渐进学习前端知识&#xff0c;一看就懂&#xff0c;小白也能转行做前端&#xff01…

基于WebGoat平台的SQL注入攻击

目录 引言 一、安装好JAVA 二、下载并运行WebGoat 三、注册并登录WebGoat 四、模拟攻击 1. 第九题 2. 第十题 3. 第十一题 4. 第十二题 5. 第十三题 五、思考体会 1. 举例说明SQL 注入攻击发生的原因。 2. 从信息的CIA 三要素&#xff08;机密性、完整性、可用性&…

推荐一款基于Spring Boot 框架开发的分布式文件管理系统,功能齐全,非常便捷(带私活源码)

前言 在数字化时代&#xff0c;文件管理是企业和个人用户的基本需求。然而&#xff0c;现有的文件管理系统往往存在一些痛点&#xff0c;如存储空间有限、文件共享困难、缺乏在线编辑功能、移动端适配性差等。这些问题限制了用户在不同设备和场景下的文件处理能力。 为了解决…

spring-retry详解

spring-retry详解 1.引入依赖2.Retryable基础使用3.Recover使用4.Retryable参数详解5.需要注意 重试机制对于大部分场景来说都是必要的&#xff0c;比如同步调用三方接口&#xff0c;三方接口、信息拉取等网络原因突然不通&#xff0c;有了重试就可以多一些容错机制&#xff0c…

压缩包方式windows安装mysql

压缩包方式windows安装mysql 本文介绍通过压缩包方式在Windows本地安装mysql。 一、 具体步驟 步骤1&#xff0c;下载mysql压缩程序 这里好像上传不了压缩文件&#xff0c;先这样吧&#xff0c;后期补充。 步骤2&#xff0c;解压并手写添加 my.ini 文件 my.ini 文件内容如下…

Air780EP-AT开发-HTTP应用指南

简介 关联文档和使用工具&#xff1a; AT固件获取AT指令手册 概述 4G模块支持HTTP和HTTPS协议&#xff0c; HTTP应用的基本流程如下&#xff1a; 1、激活PDP&#xff08;参考&#xff1a;http://oldask.openluat.com/article/937&#xff09;2、初始化HTTP服务3、设置HTTP会话…

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain&#xff0c;表示协议族&#xff0c;只能为AF_LOCAL或者AF_UNIX&#xff1b; 第2个参数type&#xff0c;表示类型&#xff0c;只能为0。 第3个参数protocol&#xff0c;表示协议&#xff0c;可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…

ontap simulator配置过程

一、下载模拟器 参考《Simulate_ONTAP_9-14-1_Installation_and_Setup_Guide.pdf》P4的指导&#xff0c;登录网站进行下载。 二、传入pve&#xff0c;并解压转换 # 解压 tar -xvf vsim-netapp-DOT9.14.1-cm_nodar.ova# 解压后的文件列表&#xff0c;其中ovf文件里定义了虚拟机…

Docker部署Elasticsearch8.6.0 Kibana8.6.0

为了匹配springboot3.0.x&#xff0c;安装Elasticsearch:8.5.3 拉取镜像&#xff0c;遇到问题&#xff01; [rootserver01 ~]# docker pull elasticsearch:8.5.3 8.5.3: Pulling from library/elasticsearch eaead16dc43b: Retrying in 1 second a405acf5b7d4: Retrying in 1…

结构体[C语言]

文章目录 结构体的概念结构体的用法定义结构体创建结构体变量访问结构体成员 结构体的应用 结构体的概念 结构体是一种用户自定义的数据类型&#xff0c;它允许我们将逻辑上相关的不同数据类型组合在一起。例如&#xff0c;如果我们想要表示一个学生的信息&#xff0c;我们可以…

texify - 识别数学/图像 PDF

文章目录 一、关于 texify例子训练 二、安装手动安装 三、使用1、使用技巧2、用于交互转换的应用程序3、转换图像4、Python 中导入并运行 四、限制五、基准测试运行自己的基准测试 六、其它商业用途感谢 一、关于 texify Texify是一种OCR模型&#xff0c;它将包含数学的图像或…

数据结构(Java):优先级队列(堆)堆的模拟实现PriorityQueue集合

目录 1、优先级队列 1.1 概念 1.2 PriorityQueue底层结构 2、 堆 2.1 堆的概念 2.2 堆的存储结构 3、优先级队列&#xff08;堆&#xff09;的模拟实现 3.1 堆的创建 3.1.1 向下调整算法建完整堆 3.2 堆的插入 3.2.1 向上调整算法 3.3 堆的删除 3.4 堆排序 4、Pri…

Java实现随机题库-全站最呆瓜思想,保证你能学会

目录 Blue留言 &#xff1a; 学本篇文章之前所需掌握技能 推荐视频&#xff1a; 代码逻辑思想 步骤&#xff1a; 1、引入依赖 2、做一个excel表格 3、java实现从excel表中取数据 第一步&#xff1a;根据excel上面的字段名&#xff08;如下图&#xff09;&#xff0…

Python应用开发——30天学习Streamlit Python包进行APP的构建(18):定制组件

Custom components定制组件 st.components.v1.declare_component 创建自定义组件,并在有 ScriptRunContext 的情况下进行注册。 如果没有 ScriptRunContext,则不会注册该组件。当自定义组件作为独立命令执行时(如用于测试),可能会出现这种情况。 要使用该函数,请从 s…

网络安全常用易混术语定义与解读(Top 20)

没有网络安全就没有国家安全&#xff0c;网络安全已成为每个人都重视的话题。随着技术的飞速发展&#xff0c;各种网络攻击手段层出不穷&#xff0c;保护个人和企业的信息安全显得尤为重要。然而&#xff0c;在这个复杂的领域中&#xff0c;许多专业术语往往让人感到困惑。为了…

分布式系列之ID生成器

背景 在分布式系统中&#xff0c;当数据库数据量达到一定量级后&#xff0c;需要进行数据拆分、分库分表操作&#xff0c;传统使用方式的数据库自有的自增特性产生的主键ID已不能满足拆分的需求&#xff0c;它只能保证在单个表中唯一&#xff0c;所以需要一个在分布式环境下都…