Spark编程-共享变量(广播变量和累加器)

共享变量是什么       

 Spark中的两个重要抽象一个是RDD,另一个就是共享变量。

        在默认情况下,当Spark在集群的多个不同节点的多个任务上并行运行一个函数时,它会把函数中涉及到的每个变量,在每个任务上都生成一个副本

        但是,有时候,需要在多个任务之间共享变量,或者在任务(Task)和任务控制节点(Driver Program)之间共享变量

        为了满足这种需求,Spark提供了两种类型的变量:广播变量(broadcast variables)和累加器(accumulators):

        广播变量(broadcast variable用来把变量在所有节点的内存之间进行共享。

        累加器(accumulator则支持在所有不同节点之间进行累加计算(比如计数或者求和)。

总之:

        累加器:用来对信息进行聚合,主要用于累计计数等场景;

        广播变量:主要用于在节点间高效分发大对象,在内存的所有节点中被访问,用于缓存变量;

广播变量

        广播变量(broadcast variables)允许程序开发人员在每个机器上缓存一个只读的变量,而不是为机器上的每个任务都生成一个副本。通过这种方式,就可以非常高效地给每个节点(机器)提供一个大的输入数据集的副本。Spark的“动作”操作会跨越多个阶段(stage),对于每个阶段内的所有任务所需要的公共数据,Spark都会自动进行广播。通过广播方式进行传播的变量,会经过序列化,然后在被任务使用时再进行反序列化。这就意味着,显式地创建广播变量只有在下面的情形中是有用的:当跨越多个阶段的那些任务需要相同的数据,或者当以反序列化方式对数据进行缓存是非常重要的。

可以通过调用SparkContext.broadcast(v)来从一个普通变量v中创建一个广播变量。这个广播变量就是对普通变量v的一个包装器,通过调用value方法就可以获得这个广播变量的值,

图解:

 编码方式

//本地创建Array
scala> val bc = sc.broadcast(Array(12,123,1234,234))
bc: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)
//从bc对象中取出Array对象即可
scala> bc.value
res0: Array[Int] = Array(12, 123, 1234, 234)

        这个广播变量bc被创建以后,在集群中的任何函数中,都应该使用广播变量bc的值,而不是使用v的值,这样就不会把v重复分发到这些节点上。此外,一旦广播变量创建后,普通变量v的值就不能再发生修改,从而确保所有节点都获得这个广播变量的相同的值。

累加器

        累加器是仅仅被相关操作累加的变量,通常可以被用来实现计数器(counter)和求和(sum)。Spark原生地支持数值型(numeric)的累加器,可以编写对新类型的支持。如果创建累加器时指定了名字,则可以在Spark UI界面看到,这有利于理解每个执行阶段的进程。
        一个数值型的累加器,可以通过调用SparkContext.longAccumulator()或者SparkContext.doubleAccumulator()来创建。运行在集群中的任务,就可以使用add方法来把数值累加到累加器上,但是,这些任务只能做累加操作,不能读取累加器的值,只有任务控制节点(Driver Program)可以使用value方法来读取累加器的值。

代码实例


下面是一个代码实例,演示了使用累加器来对一个数组中的元素进行求和:

//在Driver端定义累加器,赋初始值
scala> val amulator = sc.longAccumulator("My Accumulator")
amulator: org.apache.spark.util.LongAccumulator = LongAccumulator(id: 0, name: Some(My Accumulator), value: 0)
//在Executor端读取数组进行想加
scala> sc.parallelize(Array(12,23,45,67)).foreach(elem => amulator.add(elem))
//在Driver获取累加器的结果
scala> amulator.value
res3: Long = 147

注意点:

使用累加器的时候,要注意,因为rdd是过程数据,如果rdd被多次使用可能会重新构建此rdd,如果累加器累加代码,存在重新构建的步骤中,累加器累加代码可能被多次执行。可以采取加缓存或Checkpoint即可

参考博客:

1、厦门大学林子雨

2、PySpark 共享变量之 广播变量和累加器_pyspark 广播变量_不忘初欣丶的博客-CSDN博客

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

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

相关文章

单轴机器人的结构与特点

单轴机器人是由马达驱动的移动平台,由滚珠螺杆和 U型线性滑轨导引构成,其滑座同时为滚珠螺杆的驱动螺帽及线性滑轨的导引滑块,可用半导体、光电、交通运输业、环保节能产业、精密工具机、机械产业、智慧自动化、生技医疗上。 相对于传统的模组…

Python Web框架 Flask 安装、使用

Python Web框架 Flask 安装 安装 Flask 框架 首先需要安装 Flask 框架, 可以通过以下命令安装: [rootlocalhost web]# pip3 install Flask Collecting FlaskDownloading Flask-2.0.3-py3-none-any.whl (95 kB)|██████████████████████████████…

中国8K摄像机厂家加入国际广电设备制造商协会IABM

近日,BOSMA博冠正式成为国际广电设备制造商协会IABM会员,标志着中国8K摄像机厂家BOSMA博冠在广播电视超高清前端采集领域受到全球广电权威机构认可,进一步推动国产品牌在全球市场竞争中提升品牌知名度、加强行业影响力。 IABM创立于1976年&am…

Spring MVC 注解实现

注解描述 注解描述Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象,分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了RequestMapping 注解。Controller 只是定义了一个控制器类&#xff0c…

Docker 网络

一、背景: 想一下这个问题,容器和容器之间是否可以通过网络正常通信?宿主机和容器是否可以通信?如果可以通信,那为什么可以通信。如果不可以通信,如何让他们之间通信。接下来就详细的讲解下 docker 的网络。…

【编译之美】【4. 代码优化:为什么你的代码比他的更高效】

什么是代码优化 代码优化是编译器后端的两大工作之一,弄懂它,你就掌握了一大块后端技术。 代码优化的目标 代码优化的目标,是优化程序对计算机资源的使用。 代码优化的对象 大多数的代码优化都是在 IR 上做的,而不是在前一阶段…

数据结构---手撕图解堆的实现和TopK的应用

文章目录 重要的概念树的存储方式顺序存储链式存储 堆的概念堆的实现向上调整算法一些实现过程中的技巧实现搭建堆实现出堆的操作向下调整算法 堆排序TopK 重要的概念 要讲到堆,先要说两个关于二叉树的概念 满二叉树:一个二叉树如果每一层的节点数都是最…

FastDVDnet Towards Real-Time Deep Video Denoising Without Flow

FastDVDnet: Towards Real-Time Deep Video Denoising Without Flow Estimation 原文: https://ieeexplore.ieee.org/document/9156652 由于视频有着较强的时间相关性,那么一个好的视频去噪算法必将要充分利用这一特点。利用时间相关性主要体现为两个方面…

Serverless是什么?如何使用?有哪些优势?国内外有哪些Serverless平台?

111. Serverless是什么?如何使用?有哪些优势?国内外有哪些Serverless平台? 一、 Serverless是什么? 百度百科 Serverless 是云计算的一种模型。以平台即服务(PaaS)为基础,无服务器…

微调预训练的 NLP 模型

动动发财的小手,点个赞吧! 针对任何领域微调预训练 NLP 模型的分步指南 简介 在当今世界,预训练 NLP 模型的可用性极大地简化了使用深度学习技术对文本数据的解释。然而,虽然这些模型在一般任务中表现出色,但它们往往缺…

OpenCv (C++) 使用矩形 Rect 覆盖图像中某个区域

文章目录 1. 使用矩形将图像中某个区域置为黑色2. cv::Rect 类介绍 1. 使用矩形将图像中某个区域置为黑色 推荐参考博客:OpenCV实现将任意形状ROI区域置黑(多边形区域置黑) 比较常用的是使用 Rect 矩形实现该功能,代码如下&…

SciencePub学术 | 区块链类重点SCIEEI征稿中

SciencePub学术 刊源推荐: 区块链类重点SCIE&EI征稿中!信息如下,录满为止: 一、期刊概况: SCI-01 【期刊简介】IF:4.0-4.5,JCR2区,中科院3区; 【检索情况】SCIE&EI双检&…