据我所知,当Spark执行广播加入时,它首先将最小(广播)RDD收集到驱动程序以从中制作广播变量,然后才将其上传到每个目标节点。
如果广播RDD>有时会导致驱动程序内存流出。 spark.driver.memory。
问题:为什么它以这种方式运作?在目标节点之间调整广播数据更有效,因为要混洗的数据量相同但我们可以避免驱动程序溢出。
示例:假设您在每个节点上广播3个节点和1 GB数据,并且每个节点的吞吐量为1gb / s。
Spark方法 - 每个节点必须上传到驱动程序的数据(1gb)并下载广播变量(3 * 1g = 3gb),因此每个节点应总共传输4 GB,并且需要4s。
随机方法 - 一个节点必须上传1gb到2个其他节点并下载 1gb来自这些。同样,总量为4 gb,需要4s。
答案 0 :(得分:0)
首先,广播连接用于连接大表和极小的表。
然后如果使用shuffle而不是将小df(表格)收回到驱动程序然后广播,你只会注意到小df被洗牌,但实际上大df也在同时洗牌,这是相当的时间耗时。
答案 1 :(得分:-1)
这是不正确的。 Spark没有使用广播进行RDD连接。
Spark可能会为DataFrame
联接使用广播,但它不应该用于处理大型对象。最好使用标准的HashJoin。