【Spark源码分析】Broadcast
前言
Spark的broadcast机制本意在于两表做join时,如果其中某一个表足够的小,且又不是join的基表时(left或right join),可以将小表通过网络全量分发到各个executor节点上;通过在各个分区本地做join的方式来减少一次shuffle带来的开销
Broadcast 原理
满足broadcast join的条件源码分析
- 来看SparkStrategies.scala文件
Broadcast 策略入口 broadcastSideBySizes
可以发现broadcast 左表或者是右表是根据两个策略来控制的:canBuildLeft/canBuildRight, canBroadcast;
canBroadcast控制的是数据大小是否符合参数设定
canBuildLeft/canBuildRight是判断被广播的表是否作为left或right join基表的情况;如果作为基表的话是不能被broadcast的;当然Inner join不用管是不是基表
基表不能被广播的原因
left/right join 之所以基表不能broadcast是因为这样做会破坏left join语义,产生重复的数据(比如广播了n份基表,因为最后都要保留基表的数据,不管有没有匹配上,所以会导致归并的时候有重复的情况)
翻阅其他博客对broadcast的解释,也能发现基表不能被广播的事实 Spark SQL中Join常用的几种实现