Spark中广播对象的最大尺寸是多少?



使用dataframe广播功能或SparkContext广播函数时,可以向所有执行者发送的最大对象大小是什么?

从火花2.4开始,上限为8 GB。源代码

更新:8GB限制仍然适用于SPARK 3.2.1源代码

更新:对于Spark 3.4源代码

仍然有效

broadcast函数:

默认值为10MB,但我们使用了直到300 MB,由Spark.sql.autobroadcast Jointhreshold控制。

afaik,这完全取决于可用的内存。因此,对此没有明确的答案。我要说的是,它应该比大数据框架要少,您可以估计大小的数据框架大小如下...

import org.apache.spark.util.SizeEstimator
logInfo(SizeEstimator.estimate(yourlargeorsmalldataframehere))

基于此,您可以将broadcast提示传递给框架。

也可以看一下 Scala Doc来自sql/execution/sparkstrategies.scala

说....

  • 广播:如果联接的一侧具有估计的物理尺寸,则比用户可配置小 [[sqlconf.auto_broadcastjoin_threshold]]阈值 Side具有明确的广播提示(例如,用户应用了
    [[org.apache.spark.sql.functions.broadcast()]函数 dataFrame),然后将播放加入的那一侧 另一侧将被流式传输,没有改组
    执行。如果双方都在 阈值,广播较小的一面。如果两者都不小,则不使用BHJ。
  • shuffle hash加入:如果一个平均大小 分区足够小,可以构建哈希表。
  • 排序合并:如果匹配的联接键是可排序的。
  • 如果没有加入密钥,则选择以下优先级加入实现:
    • broadcastNestedloopjoin:如果连接的一侧可以播放
    • Cartesianproduct:对于内部加入
    • broadcastNestedloopjoin

还可以查看其他符合配置

SparkContext.broadcast(TorrentBroadcast):

广播共享变量还具有属性spark.broadcast.blockSize=4Mafaik我也没有看到过的硬核心限制...

以获取更多信息。请参阅TorrentBroadcast.scala


编辑:

但是,即使在文档中没有正式宣布这一点,您也可以看一下2GB问题(我无法在文档中看到任何此类问题)。请查看"正在进行"状态的Spark-6235&spark-6235_design_v0.02.pdf。

如上所述,上限为8GB。但是,当您有几个文件要广播时,Spark将所有数据文件推向驱动程序。驱动程序加入这些文件&推向执行器节点。在此过程中,如果驱动程序的可用内存小于合并的广播文件,则最终会出现错误错误。

相关内容

  • 没有找到相关文章