Spark似乎认为某个广播变量的大小很大

时间:2018-10-15 23:31:07

标签: apache-spark

我正在尝试在两个表上进行广播连接。较小表的大小将因参数而异,但较大表的大小接近2TB。

我注意到的是,如果我没有将spark.sql.autoBroadcastJoinThreshold设置为10G,则其中某些操作将执行SortMergeJoin而不是广播联接。但是,较小的表的大小根本不应该太大。我将较小的表写入了s3文件夹,仅占用了12.6 MB的空间。

我在较小的表上进行了一些操作,因此混洗大小出现在Spark History Server上,并且内存大小似乎为150 MB,远不及10G。另外,如果我在较小的表上强制执行广播联接,则广播会花费很长时间,这使我认为表的大小可能不只是150 MB。

什么是弄清楚Spark正在查看的实际大小并确定其是否超过spark.sql.autoBroadcastJoinThreshold定义的值的好方法?

2 个答案:

答案 0 :(得分:0)

查看spark UI中的“ SQL”选项卡。在那里,您将看到每个作业的DAG + spark收集的统计信息。
对于每个数据框,它将包含火花看到的大小。

顺便说一句,您没有将spark.sql.autoBroadcastJoinThreshold设置为较高的数字以使用广播联接强制触发火花。
您可以简单地将小dforg.apache.spark.sql.functions.broadcast(df)包装在一起,它将仅在该特定联接上强制广播

答案 1 :(得分:0)

如该问题所述:DataFrame join optimization - Broadcast Hash Join

import org.apache.spark.sql.functions.broadcast  

val employeesDF = employeesRDD.toDF
val departmentsDF = departmentsRDD.toDF

// materializing the department data
val tmpDepartments = broadcast(departmentsDF.as("departments"))

import context.implicits._

employeesDF.join(broadcast(tmpDepartments), 
   $"depId" === $"id",  // join by employees.depID == departments.id 
   "inner").show()