我知道,当试图最小化节点间数据的洗牌量时,广播变得非常有用。例如,在下面的代码中,我将airports_df广播到flights_df,以尽量减少联接操作期间的洗牌。
broadcast_df = flights_df.join(broadcast(airports_df), \
flights_df["Destination Airport"] == airports_df["IATA"] )
1.)现在,广播不需要在我的员工节点上增加存储空间吗?广播后的df会驻留在记忆中吗?如果它太大,不适合一个工人的记忆呢?
2.)广播会导致I/O瓶颈吗?
发布于 2019-12-19 07:40:21
回答你的问题,
广播变量保存在每个工作节点的缓存内存中,不确定什么是额外存储,但它只是缓存内存,是的,我们可以说它是火花内存以外的额外内存。
如前所述,广播df驻留在工作者的缓存内存中。
在默认情况下,广播变量在内存中最多可达10 to,您可以通过spark.sql.autoBroadcastJoinThreshold参数控制它。但不确定阈值。
当您广播一个值时,它只被复制到执行器一次。因此,在火花执行过程中不会重复调整数据集,这反过来又减少了网络I/O.
发布于 2019-12-19 07:00:28
当广播的df小到足以容纳内存时,您应该使用广播,如果它更小,那么您想要加入的df就会更小,因此与洗牌操作相比,您将得到更少的I/O。在默认情况下,Spark使用10 of的阈值来确定df是否是一个很好的广播候选,并且可以自己进行优化。当然,阈值是可配置的。我已经在DFs上使用了广播,当它是合理的(即另一个df是几十个GBs甚至更多)时,它会达到数十甚至数百mb。所以这一切最终都是为了取舍。
https://stackoverflow.com/questions/59411276
复制