在 Spark 中广播数据帧时会出现哪些缺点?

What drawbacks can be expected when broadcasting dataframes in Spark?

我知道广播在尝试最小化跨节点的数据混洗量时变得非常有用。例如,在下面的代码中,我将 airports_df 广播到 flights_df 以最大程度地减少连接操作期间的混洗。

broadcast_df = flights_df.join(broadcast(airports_df), \
flights_df["Destination Airport"] == airports_df["IATA"] )

1.) 现在,广播不需要我的工作节点上的额外存储空间 space 吗?广播的df会驻留在内存中吗?如果它太大而无法容纳工人的记忆怎么办?

2.) 广播会导致 I/O 瓶颈吗?

当广播的 df 足够小以适合内存时,你应该使用广播,如果它比你想要加入的 df 小得多,那么你最终会得到更少 I/O 相比洗牌操作。默认情况下,Spark 使用 10MB 的阈值来确定 df 是否适合广播,并且可以自行进行此优化。当然,阈值是可配置的。我在 DFs 上使用广播达到几十甚至几百 mb 是合理的(即另一个 df 是几十 GB 甚至更多)。 所以这一切最终都需要权衡...

回答您的问题,

  1. 现在,广播不需要我的工作节点上的额外存储空间 space 吗?广播的df会驻留在内存中吗?如果它太大而无法容纳工人的内存怎么办?

Broadcast variables are kept in cache memory of each worker node, not sure what you mean additional storage, but its nothing but cache memory and yes we can say its a additional memory other than spark memory.

As mentioned earlier broadcast df reside in cache memory of worker.

Broadcast variables up to 10mb by default fit in memory, you can control it by spark.sql.autoBroadcastJoinThreshold parameter. Not sure about the threshold value though.

  1. 广播会导致 I/O 瓶颈吗?

When you broadcast a value, it is copied to executors only once. So there will no repetitive shuffling of data set during spark execution, which in turn less network I/O.