spark broadcast解析和测试
参考资料
http://spark.apache.org/docs/2.4.1/rdd-programming-guide.html#broadcast-variables
broadcast 广播机制
官网介绍
Broadcast variables allow the programmer to keep a read-only variable cached on each machine rather than shipping a copy of it with tasks
广播变量的作用相当于之前向每个task传输一份数据变成了现在向每个节点传输一份数据(然后再本地拉取。)。这样的作用就是效率提高,减少了数据在网络间的传输时间,尤其在task数量多的情况下,效率提升明显。
适用场景
官网介绍
Spark automatically broadcasts the common data needed by tasks within each stage. The data broadcasted this way is cached in serialized form and deserialized before running each task. This means that explicitly creating broadcast variables is only useful when tasks across multiple stages need the same data or when caching the data in deserialized form is important.
大致意思是,spark会广播变量在stage之间。所以需要有stage的场景(有shuffle)才需要广播变量,并且需要相同的数据。 (以反序列化形式缓存数据 这块不太理解,没用的到)
在实际工作的时候,做电信项目的时候,会有一些工参表,这个时候广播变量就显得很有必要,之前我们的处理方式是将工参表广播出去,然后注册成一张临时表来供使用,样例代码
val gongcan = session.sql("select * from ceshi.gongcan")
//这种方式相当于先广播然后注册成一张临时表
val value = broadcast(gongcan).createOrReplaceTempView("gongcan")
示例代码相关
广播变量有很多种形式,这里只记录自己用过的两种
1、广播并注册临时表
val gongcan = session.sql("select * from ceshi.gongcan")
//这种方式相当于先广播然后注册成一张临时表
val value = broadcast(gongcan).createOrReplaceTempView("gongcan")
#######2、Broadcast Hint for SQL Queries
样例类似于在sql中加 /*+ BROADCAST(g) */
hint模式 参考 http://spark.apache.org/docs/2.4.1/sql-performance-tuning.html#other-configuration-options
样例代码
//这种hint模式来创建广播变量
session.sql("select /*+ BROADCAST(g) */ t.ccard,t.ename,t.phone,g.name from ceshi.test t join ceshi.gongcan g on t.ccard=g.name").write.csv("/user/zgh/broad")
具体影响
参考:https://www.jianshu.com/p/2c7689294a73
我以上面
//这种hint模式来创建广播变量
session.sql("select /*+ BROADCAST(g) */ t.ccard,t.ename,t.phone,g.name from ceshi.test t join ceshi.gongcan g on t.ccard=g.name").write.csv("/user/zgh/broad")
这种方式来做了测试
1、没有广播变量的方式
image.png2、有广播变量的方式
image.png这么看来,有了广播变量,shuffle过程都省略了,相当于在每个节点的本地完成了关联等操作
注意
广播表的最大大小被这个参数所控制 默认10M
spark.sql.autoBroadcastJoinThreshold
当小于该配置是,小表会被自动的广播出去。(参考的2.4.1版本)
当大于改配置时,需要显示的广播下。