spark广播连接将数据加载到驱动程序

dhxwm5r4  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(415)

据我所知,spark在执行broadcast join时,首先收集最小的(broadcast)rdd到驱动程序,从中生成一个broadcast变量,然后上传到每个目标节点。
如果广播rdd>spark.driver.memory,有时会导致驱动程序内存外流。
问题是:为什么会这样?只在目标节点之间洗牌广播数据更有效,因为要洗牌的数据量是相同的,但我们可以避免驱动程序溢出。
示例:假设您有3个节点和1 gb的数据要在每个节点上广播,并且每个节点的吞吐量为1gb/s。
spark方法-每个节点必须上传到驱动程序的数据块(1gb)和下载广播变量(3*1g=3gb),因此每个节点总共传输4GB,需要4s的时间。
洗牌方法-一个节点必须上传1gb到另外两个节点,然后从这些节点下载1gb。同样,总容量是4GB,需要4s的时间。

kpbwa7wx

kpbwa7wx1#

这是不正确的。spark不使用广播来连接rdd。
spark可以使用广播 DataFrame 但它不应用于处理大型对象。最好使用标准hashjoin。

zed5wv10

zed5wv102#

首先,广播连接用于连接大表和极小表。
如果使用shuffle而不是将小df(表)收集回driver然后广播,你只会注意到小df被洗牌,而实际上大df也同时被洗牌,这相当耗时。

相关问题