问题描述
我对何时广播数据帧有疑问。
广播数据帧的副本被发送到每个执行器。
那么,Spark 什么时候从每个 Executor 驱逐这些副本?
解决方法
我发现这个主题在功能上很容易理解,但手册在技术上更难遵循,而且总是有改进。
我的看法:
- 有一个
ContextCleaner
在驱动程序上为每个 Spark 应用程序运行。 - 它会在
SparkContext
开始时立即开始创建。 - 更多的是关于 Spark 中的各种对象。
-
ContextCleaner
线程清理 RDD、shuffle 和广播状态,使用始终运行的keepCleaning
方法的累加器 从这个班级。它决定哪些对象由于不再被驱逐而需要驱逐 被引用,这些被放在一个列表中。它调用各种方法,例如 如registerShuffleForCleanup
。也就是说,检查是否有alive root
对象指向给定的对象;如果是,则该对象有资格进行清理、驱逐。 -
context-cleaner-periodic-gc
异步请求标准 JVM 垃圾收集器。定期运行此操作在以下时间开始ContextCleaner
在ContextCleaner
终止时开始和停止。 - Spark 使用标准的 Java GC。
这个 https://mallikarjuna_g.gitbooks.io/spark/content/spark-service-contextcleaner.html 是 Spark 官方文档旁边的一个很好的参考。