Spark中的闭包引用和广播变量
闭包引用
概念
所有编程语言都有闭包的概念,闭包就是在一个函数中引用了函数外的变量。
Spark中,普通的变量是在Driver程序中创建的,RDD的计算是在分布式集群中的task程序上进行的。因此,当分布式算子的函数引用了外部的变量时,Driver会把该变量序列化后通过网络发送给每一个task(只针对普通对象)。
spark中所谓"闭包引用",只是看起来类似各种编程语言中的闭包。而本质上就是对某个对象进行序列化+复制,即Driver把分布式算子中引用的外部变量序列化后,发送给每个task来使用。
在闭包函数内对外部变量进行修改,闭包外的变量的并不会改变。因为在闭包函数内的修改,只是在task上对复制过来的闭包对象副本的修改,并不会影响到driver端的原对象,他们是存在于两台机器上的独立的文件,互不影响。
好处
应用于大表join小表的场景,将小表数据(字典表、维度表)发送到大表所在节点的内存中,在map阶段完成join,无需通过两个rdd去join,省去了shffule操作。
适用条件
1、闭包引用的对象,必须实现序列化接口:extends Serializable
2、被引用的对象,数据量不能太大,否则会导致task端内存溢出。
单例对象的闭包引用
单例对象(object对象)只在每个executor进程中持有一份,由其中的多个task线程共享。不要在task中对单例对象进行修改操作,否则会产生线程安全问题。而普通对象在每个task线程中都持有一份,不存在线程安全问题。
广播变量
闭包引用的场景中,Spark为每个task都复制了一份它需要的数据,当数据量较大且task较多时,必然会给网络io和内存资源造成很大压力,而广播变量只给每个executor发送一份变量副本,由多个task共享。
和闭包引用的区别
1、闭包引用中,是由driver给每个executor直接发送数据。广播变量中,是通过bittorrent协议来发送数据的,可以减少通信成本。(所有executor遵循了人人为我,我为人人的原则)。
2、闭包引用中,每个task持有一份引用对象的副本,并可以修改(只在该task线程生效);广播变量中,一个executor只持有一份广播变量的副本,由多个task共享,该数据是只读的,不可修改。
Spark中的闭包引用和广播变量的更多相关文章
- Spark(三)RDD与广播变量、累加器
一.RDD的概述 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可 ...
- Spark入门3(累加器和广播变量)
一.概要 通常情况下,当向Spark操作传递一个函数时,它会在一个远程集群节点上执行,它会使用函数中所有变量的副本.这些变量被复制到所有的机器上,远程机器上并没有被更新的变量会向驱动程序回传.在任务之 ...
- Spark学习之路(六)—— 累加器与广播变量
一.简介 在Spark中,提供了两种类型的共享变量:累加器(accumulator)与广播变量(broadcast variable): 累加器:用来对信息进行聚合,主要用于累计计数等场景: 广播变量 ...
- Spark 系列(六)—— 累加器与广播变量
一.简介 在 Spark 中,提供了两种类型的共享变量:累加器 (accumulator) 与广播变量 (broadcast variable): 累加器:用来对信息进行聚合,主要用于累计计数等场景: ...
- 入门大数据---Spark累加器与广播变量
一.简介 在 Spark 中,提供了两种类型的共享变量:累加器 (accumulator) 与广播变量 (broadcast variable): 累加器:用来对信息进行聚合,主要用于累计计数等场景: ...
- spark累加器、广播变量
一言以蔽之: 累加器就是只写变量 通常就是做事件统计用的 因为rdd是在不同的excutor去执行的 你在不同excutor中累加的结果 没办法汇总到一起 这个时候就需要累加器来帮忙完成 广播变量是只 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- Spark中的编程模型
1. Spark中的基本概念 Application:基于Spark的用户程序,包含了一个driver program和集群中多个executor. Driver Program:运行Applicat ...
- 初识Flink广播变量broadcast
Broadcast 广播变量:可以理解为是一个公共的共享变量,我们可以把一个dataset 或者不变的缓存对象(例如map list集合对象等)数据集广播出去,然后不同的任务在节点上都能够获取到,并在 ...
- 【Spark篇】---Spark中广播变量和累加器
一.前述 Spark中因为算子中的真正逻辑是发送到Executor中去运行的,所以当Executor中需要引用外部变量时,需要使用广播变量. 累机器相当于统筹大变量,常用于计数,统计. 二.具体原理 ...
随机推荐
- js实现页面窗口录制
一.在线demo 1.在线demo地址:http://www.lb0125.com/videoRecord.html 注:目前测试发现只有在chrome浏览器里可以使用 二.直接上代码 <!DO ...
- verilog之function
verilog之function 1.基本作用 function,就是声明一个函数.与task的区别就是有参数.function的返回值就是函数名(可以设置位宽),输入值任意,均作为输入参数.代码块需 ...
- 索引与查询使用的 collate 不一致导致无法使用索引
索引与表的collate 不一致的情况下,会导致表上的索引不可用,这时要想使用索引,必须在SQL 语句指定建索引所用的collate. 数据库默认collate : test=# \l List of ...
- FineReport报表绕过预览直接打印
常规情况下,打印报表的一版操作是: 1.点击相关报表查询页面,展示查询结果,即即将打印的页面 2.点击打印按钮,进入浏览器的打印预览界面 3.点击打印 但是某些时候我们可能会希望不需要点开某张报表即可 ...
- mybatis添加maven依赖
1 <dependencies> 2 <!--导入Mybatis依赖包--> 3 <dependency> 4 <groupId>org.mybatis ...
- 鸿蒙HarmonyOS实战-ArkUI组件(Button)
一.Button Button(按钮)是一种常见的用户界面控件,通常用于触发操作或提交数据.Button 拥有文本标签和一个可点击的区域,用户点击该区域即可触发相应的操作或事件. Button 的主要 ...
- Jetty的bytebufferpool模块
bytebufferpool模块用于配置Jetty的ByteBuffer对象的对象池. 通过对象池的方式来管理ByteBuffer对象的使用和生命周期,期望降低Jetty进程内存的使用,同时降低JVM ...
- DevEco Device Tool 助力OpenHarmony设备开发
DevEco Device Tool 为设备开发者提供一站式的开发环境和资源获取通道,实现了从芯片模板工程创建.到开发资源挑选定制,再到快速编码.轻小型系统调试调优.烧录环节的全流程覆盖,帮助开发者实 ...
- Unity-PC 端调用SpVoice语音 (文字转语音)
第一步引用文件 在VS当中 点击项目->添加引用-> 搜索Microsoft Speech Objecet Library 然后选中前面的白色方块点击确定就行了 插入之后 你的引用库中会多 ...
- Blocks(单调栈)
题干中说每次选择一个大于k的数,还要选他左右两个数其中之一加上一,最后问你最长的每个数不小于K的子序列. 这些都是障眼法,其实就是问你最长的平均值大于或等于K的最长子序列,这样就明朗了. 接下来就是找 ...