广播哈希联接-迭代

vik*_*ana 8 apache-spark apache-spark-sql pyspark

当我们有一个足够小以适合内存的数据帧时,我们在Spark中使用广播哈希联接。当小数据框的大小小于以下时,spark.sql.autoBroadcastJoinThreshold 我对此几乎没有疑问。

我们提示广播的小数据帧的生命周期是多少?它会在内存中保留多长时间?我们如何控制它?

例如,如果我使用广播哈希连接将大型数据框与小型数据框连接了两次。第一次执行联接时,它将把小数据帧广播到工作节点并执行联接,同时避免大数据帧数据的混排。

我的问题是,执行者将保留广播数据帧的副本多长时间?它会保留在内存中直到会话结束吗?否则,一旦我们采取任何措施,它将被清除。我们可以控制还是清除它?或者我只是在错误的方向上思考...

Dav*_*rio 6

至少在Spark 2.4.0中,您的问题的答案是,数据帧将保留在驱动程序进程的内存中,直到SparkContext完成(即,直到您的应用程序结束)为止。

广播联接实际上是使用广播变量实现的,但是使用DataFrame API时,您无法访问基础广播变量。在内部使用它后,Spark本身不会销毁此变量,因此它始终存在。

具体来说,如果您查看BroadcastExchangeExec的代码(https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/exchange/BroadcastExchangeExec .scala),您会看到它创建了一个私有变量relationFuture,该私有变量包含Broadcast变量。此私有变量仅在此类中使用。作为用户,您无法访问它以对其调用destroy,而curretn实现中的任何地方都不会为您调用Spark。