本文为纯原创,转载请注明出处,谢谢
spark广播变量适用于多节点并行操作同一变量的情况,如果spark每次都将该变量分发到不同executor节点那么浪费资源又占用带宽,所以可以将变量在driver端创建一份然后通过广播变量广播到各个executor,相当于多个executor共享一个变量,这样即方便又节约资源。类似下图(图片来源于网络,侵删)
不使用广播变量
使用广播变量
使用广播变量是我最近项目上做性能调优的一个手段,但是也踩了比较多的坑,现记录如下,以作参考
1、广播的变量必须进行序列化,如果是自定义的类,需要实现Serializable接口(至于为什么要序列化,欢迎自行阅读spark官网,此处不做解释)
此处说的实现序列化接口,不单单是广播的类需要实现,如果该类中包含其他类,那么其他类也同样需要实现序列化接口
例如:
Map<String,Buffer> broadcastBuffer=new HashMap<String,Buffer> 作为值放入广播变量JavaSparkContext.broadcast(broadcastBuffer) 此处不光要求HashMap需要实现