当我们使用广播连接和提示时,火花是如何广播数据的--正如我在使用广播提示时所看到的:它调用这个函数
def broadcast[T](df: Dataset[T]): Dataset[T] = {
Dataset[T](df.sparkSession,
ResolvedHint(df.logicalPlan, HintInfo(strategy = Some(BROADCAST))))(df.exprEnc)
},它内部调用dataset的应用方法&使用logicalPlan设置ResolvedHint
val dataset = new Dataset(sparkSession, logicalPlan, implicitly[Encoder[T]])但这之后是什么。这实际上是如何工作的,为之编写的代码在哪里。
发布于 2022-10-03 13:50:06
对于广播过程中的1和2,连接数据是在驱动程序上收集的,以后发生的事情取决于连接算法。
对于BroadcastHashJoin(BHJ)驱动程序,生成哈希表,然后将此表分发给执行者。
对于BroadcastNestedLoops,广播数据集作为数组分发给执行者。
因此,您可以看到,这里没有保存初始结构,需要将整个广播数据集放入驱动程序的内存中(否则,由于驱动程序出现oom错误,作业将失败)
关于3,你到底想知道什么?
星星之火中有TorrentBroadcast,它是像BitTorrent那样的广播实现。我对这件事不太了解(我从来没必要这么深入地挖掘),但如果你想知道更多,我想你可以从这里开始:
HttpBroadcast docu -它的其他广播算法
https://stackoverflow.com/questions/73918989
复制相似问题