ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Spark中的闭包引用和广播变量
[打印本页]
作者:
宝塔山
时间:
2024-5-19 02:16
标题:
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共享,该数据是只读的,不可修改。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4