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

时间:2016-12-08 18:00:54

标签: apache-spark dataframe apache-spark-sql broadcast

使用Dataframe broadcast函数或SparkContext broadcast函数时,可以分配给所有执行程序的最大对象大小是多少?

3 个答案:

答案 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