前言

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常用的几种实现