论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
大数据
›
数据仓库与分析
›
Spark中的闭包引用和广播变量
Spark中的闭包引用和广播变量
宝塔山
金牌会员
|
2024-5-19 02:16:43
|
显示全部楼层
|
阅读模式
楼主
主题
645
|
帖子
645
|
积分
1935
闭包引用
概念
所有编程语言都有闭包的概念,闭包就是在一个函数中引用了函数外的变量。
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共享,该数据是只读的,不可修改。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
宝塔山
金牌会员
这个人很懒什么都没写!
楼主热帖
分布式事务 | 使用DTM 的Saga 模式 ...
WebLogic JNDI注入(CVE-2021-2109) ...
HTTPS基础原理和配置-3
JVM中的编译器
SQL Server实例间同步登录用户 ...
从零写一个兼容MySQL/Oracle的Proxy中 ...
Sqlserver2012卸载
轻量级CI/CD发布部署环境搭建及使用_03 ...
让开发者成为决定性力量,华为开发者英 ...
Redis监控指标
标签云
挺好的
服务器
快速回复
返回顶部
返回列表