spark中map端join
实体数据与字典数据进行关联时,我们可以用闭包或者广播变量或者字典文件,将字典数据发送到每个task,不采用join的方式以此来减少shuffer提高效率。
// shuffer,reduce端join
data.join(obj).map(joined=>{
obj
})
// map端join
// 缓存文件
sc.addFile("/usr/data/dict.data")
data.map(dt=>{
val br = new BufferedReader("dict.data")
})
// 闭包引用
val obj = new RDD()
data.map(dt=>{
obj
})
// 广播变量引用
val obj = new RDD()
val btobj=sc.broadcast(obj)
data.map(dt=>{
btobj.value
})
回顾mapReduce中的缓存文件

}
闭包和广播变量的区别
前者发送数据的时候,采用bitTolerant协议,首先driver将obj序列化后分为多份,然后某个task获取到一部分之后就可以作为服务器发给另外的task。因此效率高
后者每个task的obj数据都有driver端序列化后发送过来的

结论1:广播变量传输的效率要高于闭包引用,尤其是obj数据比较大时效果明显。
结论2:task获取到广播变量的数据是只读的不能修改,闭包是可以修改的,但是也只有在自己的task进程中才有效