vik*_*ana 8 apache-spark apache-spark-sql pyspark
当我们有一个足够小以适合内存的数据帧时,我们在Spark中使用广播哈希联接。当小数据框的大小小于以下时,spark.sql.autoBroadcastJoinThreshold
我对此几乎没有疑问。
我们提示广播的小数据帧的生命周期是多少?它会在内存中保留多长时间?我们如何控制它?
例如,如果我使用广播哈希连接将大型数据框与小型数据框连接了两次。第一次执行联接时,它将把小数据帧广播到工作节点并执行联接,同时避免大数据帧数据的混排。
我的问题是,执行者将保留广播数据帧的副本多长时间?它会保留在内存中直到会话结束吗?否则,一旦我们采取任何措施,它将被清除。我们可以控制还是清除它?或者我只是在错误的方向上思考...
至少在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。
| 归档时间: |
|
| 查看次数: |
755 次 |
| 最近记录: |