答案 0 :(得分:12)
broadcast
function : 默认值为10mb,但我们使用的直到300 mb,由spark.sql.autoBroadcastJoinThreshold控制。
AFAIK,这完全取决于可用的内存。所以没有明确的答案。我要说的是,它应该小于大型数据帧,您可以估算大型或小型数据帧大小,如下所示......
import org.apache.spark.util.SizeEstimator
logInfo(SizeEstimator.estimate(yourlargeorsmalldataframehere))
基于此,您可以将broadcast
提示传递给框架。
另外看看 斯卡拉文件来自 sql/execution/SparkStrategies.scala
说......
- 广播:如果联接的一侧估计的物理尺寸小于用户可配置的尺寸 [[SQLConf.AUTO_BROADCASTJOIN_THRESHOLD]]阈值或者如果是 side有一个明确的广播提示(例如用户应用了 [[org.apache.spark.sql.functions.broadcast()]]函数到 DataFrame),那么连接的那一面将被广播 另一边将流式传输,没有洗牌 执行。如果双方都低于 门槛,广播较小的一面。如果两者都不小,则不使用BHJ。
- 随机散列连接:如果是单个的平均大小 分区足够小,可以构建哈希表。
- 排序合并:如果匹配的连接键是可排序的。
- 如果没有连接键,则选择Join实现,优先级如下:
- BroadcastNestedLoopJoin:如果可以广播联接的一方
- CartesianProduct:for Inner join
- BroadcastNestedLoopJoin
另请查看other-configuration-options
SparkContext.broadcast
(TorrentBroadcast):广播共享变量也有一个属性spark.broadcast.blockSize=4M
AFAIK我没有看到这方面的核心限制......
了解更多信息,请参阅。见TorrentBroadcast.scala
然而,您可以查看2GB问题即使这在官方中未正式声明(我在文档中无法看到任何此类问题)。 请看SPARK-6235 which is "IN PROGRESS" state& SPARK-6235_Design_V0.02.pdf。
答案 1 :(得分:1)
如上所述,上限为 8GB。但是当您有多个文件要广播时,spark 将所有数据文件推送到驱动程序。驱动程序加入这些文件并推送到执行程序节点。在此过程中,如果驱动程序的可用内存小于组合广播文件,则会出现内存不足错误。
答案 2 :(得分:0)
自Spark 2.4起,上限为8 GB。 Source Code