6.Spark共享变量

概述

  • 共享变量
    • 共享变量的工作原理
    • Broadcast Variable
    • Accumulator

共享变量

共享变量的工作原理

通常,当给 Spark 操作的函数(如 mpareduce) 在 Spark 集群上执行时,函数中的变量单独的拷贝到各个节点上,函数执行时,使用的是自己节点执行上的变量,节点上的变量更新不会更新至 driver ,在任务之间支持通用的读写共享变量是低效的;然而,Spark 的提供了两种有限类型的共享变量:broadcast variablesaccumulators

Broadcast Variable

Broadcast Variable会将使用到的变量,仅仅为每个节点拷贝一份,而不会为每个task都拷贝一份副本,因此其最大的作用,就是减少变量到各个节点的网络传输消耗,以及在各个节点上的内存消耗
通过调用SparkContextbroadcast()方法,针对某个变量创建广播变量
注意: 广播变量,是只读的,在算子函数内,使用到广播变量时,每个节点只会拷贝一份副本。可以使用广播变量的value()方法获取值。

由下图,深入理解 Broadcast Variable
在这里插入图片描述
由图可知,普通变量Broadcast Variable 区别就是,网络传输可以大大的降低,Broadcast Variable 是每个节点机器只有一份,而 普通变量 是每个 task 都会有一份,浪费内存存储。

可以想象一个极端情况,如果map算子有10个task,恰好这10个task还都在一个worker节点上,那么这个时候,map算子使用的外部变量就会在这个worker节点上保存10份,这样就很占用内存了。

接下来通过具体的案例,来使用一下这个广播案例;代码如下图:

object BroadcastOpScala {def main(args: Array[String]): Unit = {val conf = new SparkConf()conf.setAppName("BroadcastOpScala").setMaster("local")val sc = new SparkContext(conf)val dataRdd = sc.parallelize(Array(1, 2, 3, 4, 5))val variable = 2// 1.定义广播变量val variableBroadcast = sc.broadcast(variable)// 2.使用广播变量,调用其 value方法dataRdd.map(_ * variableBroadcast.value).foreach(println _)}
}

在这里插入图片描述

Accumulator

Spark 提供的 Accumulator,主要用于多个节点对一个变量进行共享性的操作。
正常情况下在 Spark的任务中,由于一个算子可能会产生多个 task 并行执行,所以在这个算子内部执行的聚合计算,都是局部的,想要实现多个 task 进行全局聚合计算,此时就需要用到 Accumulator 这个共享的累加变量 。

注意: Accumulator只提供了累加的功能。在task只能对Accumulator进行累加操作,不能读取它的值。只有在Driver进程中才可以读取Accumulator的值。

代码如下:

object AccumulatorOpScala {def main(args: Array[String]): Unit = {val conf = new SparkConf()conf.setAppName("AccumulatorOpScala").setMaster("local")val sc = new SparkContext(conf)val dataRDD = sc.parallelize(Array(1,2,3,4,5))// 1.定义累加变量val sumAccumulator = sc.longAccumulator// 2.使用累加变量dataRDD.foreach(sumAccumulator.add(_))println(sumAccumulator.value)}
}

在这里插入图片描述

结束

至此共享变量就结束了,如有问题,欢迎评论区提问。

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

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

相关文章

zookeeper节点类型

节点类型 持久节点(Persistent Nodes) 这些是Zookeeper中最常见的一种节点类型,当创建一个持久类型节点时,该值会一直存在zookeeper中,直到被显式删除或被新值覆盖。 临时节点(Ephemeral Nodes&#xff…

STM32中微秒延时的实现方式

STM32中微秒延时的实现方式 0.前言一、裸机实现方式二、FreeRTOS实现方式三、定时器实现(通用)4、总结 0.前言 最近在STM32驱动移植过程中需要用到微秒延时来实现一些外设的时序,由于网上找到的驱动方法良莠不齐,笔者在实现时序过…

【数据结构】败者树的建树与比较过程

文章目录 前置知识归并段 建树过程比较过程疑问为什么比较次数减少了?如果某个归并段的元素一直获胜,没有元素了怎么办?处理方法 1处理方法 2 前置知识 归并段 外部排序算法通常用于处理大规模数据,其中数据量远超过计算机内存的…

修改一下第二次课服务枚举等问题

关于AutoRuns 的总结里面,有个错误,Image hijacks 这个准确的描述应该是镜像劫持 和系统运行相关的image,我们通常指的是二进制镜像文件 Image hijacks镜像劫持 简单来说就是,在注册表中,有部分设置,是规…

产品经理入门学习(五):思维导图 原型设计

参考引用 黑马-产品经理入门基础课程 1. 思维导图的作用和应用场景 什么是思维导图? 思维导图是一种将思维进行可视化的实用工具。具体实现方法是用一个关键词去引发相关想法,再运用图文并茂的技巧把各级主题的关系用相互隶属的层级表现出来,…

Flutter笔记:发布一个模块 scale_design - (移动端)设计师尺寸适配工具

Flutter笔记 发布一个模块scale_design设计师尺寸适配工具与常用组件库 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/a…

容器核心技术-Namespace

一、容器 基于Linux 内核的 Cgroup, Namespace,以及Union FS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。 1.1 容器主要特性…

中国电子学会主办 第四届ATEC科技精英赛报名启动

11月1日由中国电子学会主办的第四届ATEC科技精英赛(ATEC2023)正式启动报名。 ATEC科技精英赛是主要面向中国籍计算机等专业在校学生、人工智能及网络安全行业研究者和从业者的一场高水平的智能科技挑战赛,意在贯彻落实党中央、国务院关于推动…

性能优化之懒加载 - 基于观察者模式和单例模式的实现

一、引入 在前端性能优化中,关于图片/视频等内容的懒加载一直都是优化利器。当用户看到对应的视图模块时,才去请求加载对应的图像。 原理也很简单,通过浏览器提供的 IntersectionObserver - Web API 接口参考 | MDN (mozilla.org)&#xff0c…

SpringSecurity全家桶 (二) ——实现原理

1. SpringSecurity的强大之处 当我们并未设置登录页面时,我们只需要导入SpringSecurity的依赖就可以令我们的界面进入保护状态,由下面例子可以凸显出: 随便写个接口 RequestMapping("/hello")public String hello(){return "H…

旧手机搭建linuxcentos

centos服务器搭建termux搭建centos旧手机搭建linux服务器ubuntu旧手机搭建网站旧手机搭建linux debian ubuntu centos 旧手机搭建宝塔搭建 32位Linux搭建宝塔 Linuxdeploy搭建宝塔 旧手机搭建服务器有需要的来 包答疑包售后 Linuxdeploy需要root mobile搭建服务器 脚本/工具

03 矩阵与线性变换

矩阵与线性变换 线性变换如何用数值描述线性变换特殊的线性变换反过来看总结 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 线性变换 如果一个变换具有以下两个性质,我们就称它是线性的: 一是直线在变换后仍然保持为直线二是原点必须…

网安新旅程

网安新旅程 将近四个月没发博客了,今天交代一下最近发生的事情和规划。 TryHackMyOffsecBox QQ交流 君羊:751273347 近期的事情 6月开始我进入htb学院学习CPTS,7月左右我完成了95%左右的内容。7-8月份我基本都在做C#相关的开发&#xff0c…

【KVM】KVM介绍及功能概述

前言 大家好,我是秋意零。 今天介绍的内容是KVM的概述,以及它所支持的基本功能。 👿 简介 🏠 个人主页: 秋意零🔥 账号:全平台同名, 秋意零 账号创作者、 云社区 创建者&#x1f…

NTFS文件系统解析(三)

1、引言 对于NTFS文件系统而言,无论文件内容本身,抑或真实的文件属性,都被称之为属性。 而正如前文说到的,NTFS预定义了16种属性用于文件系统的管理。 而通常情况下,往往只需要关注其中的某些属性即可。 2、属性头 …

【AI】Stable-Diffusion-WebUI使用指南

注:csdn对图片有审核,审核还很奇葩,线稿都能违规,为保证完整的阅读体验建议移步至个人博客阅读 最近AI绘画实现了真人照片级绘画水准,导致AI绘画大火,公司也让我研究研究,借此机会正好了解一下…

一个JS版寻路的实现

js版的寻路的测试 20231104_161146 path get_v8: function (x_inc, y_inc) {if (x_inc 0) {if (y_inc < 0) {return [[0, -1], [-1, -1], [1, -1], [-1, 0], [1, 0], [-1, 1], [1, 1], [0, 1]];} else if (y_inc > 0) {return [[0, 1], [-1, 1], [1, 1], [-1, 0], [1, 0…

090基于web+springboot的中小企业设备管理系统

欢迎大家关注&#xff0c;一起好好学习&#xff0c;天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本中小企业设备管理系统管理员有个人中心&#xff0c;用户管理&#xff0c;员工管理&#xff0c;设备信息管理&#xff0c;配件信息管…

c++类和对象(八) static成员 友元

1.1 概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之为静态成员变量&#xff1b;用static修饰的成员函数&#xff0c;称之为静态成员函数。静态成员变量一定要在类外进行初始化。 面试题&#xff1a;实现一个类&#xff0c;计算…