使用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=4M
afaik我也没有看到过的硬核心限制...
以获取更多信息。请参阅TorrentBroadcast.scala
编辑:
但是,即使在文档中没有正式宣布这一点,您也可以看一下2GB问题(我无法在文档中看到任何此类问题)。请查看"正在进行"状态的Spark-6235&spark-6235_design_v0.02.pdf。
如上所述,上限为8GB。但是,当您有几个文件要广播时,Spark将所有数据文件推向驱动程序。驱动程序加入这些文件&推向执行器节点。在此过程中,如果驱动程序的可用内存小于合并的广播文件,则最终会出现错误错误。