collect() 后如何清除火花驱动程序内存

Posted

技术标签:

【中文标题】collect() 后如何清除火花驱动程序内存【英文标题】:How to purge spark driver memory after collect() 【发布时间】:2019-12-16 16:15:52 【问题描述】:

我必须在我的应用程序中做很多小的collect() 操作才能通过HTTPcall 发送数据。

val payload = sparkSession.sql(s"select * from table where ID = id").toJSON.collect().mkString("\n")

有没有办法在操作之间清除使用过的对象以释放驱动程序中的一些内存空间?

【问题讨论】:

JVM 将从内存中释放所有不需要的对象。但是,如果您发现自己做了很多 collects 并且对内存感到疑惑,那么您应该检查您的设计。 【参考方案1】:

首先,我同意@Luis Miguel Mejia Suarez 的观点,因为收集通常是不好的做法和不好的代码味道。我会看看你为什么要收集,并确定你是否可以用不同的方式做到这一点。

至于您的实际问题,一旦内存开始变得紧张,垃圾收集器将释放任何未引用的内存。上面显示的代码 sn-p 应该没问题,因为 collect 的输出立即被操作然后丢弃,因此在下一次 GC 暂停期间应该删除输出,同时保留 mkString 输出。因此,请确保这适用于您正在使用的其他收集语句。

此外,如果您看到长时间的 GC 暂停,请考虑降低驱动程序内存大小,以便收集更少的内存。你也可以考虑调整你的 GC 参数。网上有很多关于这方面的文档,这里描述的太复杂了。

最后,您可以强制 JVM 运行垃圾收集。您应该能够使用 System.gc() (https://docs.oracle.com/javase/7/docs/api/java/lang/System.html#gc())。这是一个 Java 函数,但 Scala 也应该能够调用它。

【讨论】:

以上是关于collect() 后如何清除火花驱动程序内存的主要内容,如果未能解决你的问题,请参考以下文章

在火花中,如何同时运行几个“收集”

在python中使用gc.collect()清除内存对缓存数据的queue队列是否有影响

如何清除Tensorflow-Keras GPU内存?

Apache火花中的Spark驱动程序

如何使用Spark Structured Streaming连续监视目录

使用 s3a 在驱动程序和执行程序中获取火花罐