首页 > 解决方案 > org.apache.hadoop.io.compress.GzipCodec,在这个类中GzipOutputStream没有关闭,所以内存泄漏

问题描述

org.apache.hadoop.io.compress.**GzipCodec,在这个类GzipOutputStream中没有关闭,所以内存泄漏。

如何关闭GzipOutputStream?或者其他流也应该关闭?有没有好的选择?

spark版本是2.1.0,hadoop版本是2.8.4

sparkPairRdd.saveAsHadoopFile(outputPath, String.class, String.class, MultipleTextOutputFormat.class, GzipCodec.class);

标签: javahadoopgzipoutputstream

解决方案


如果我GzipCodec正确理解了这个类,它的目的是创建各种压缩器和解压缩器流并将它们返回给调用者。它不负责关闭这些流。那是调用者的责任。

如何关闭一个GzipOutputStream

您只需调用close()对象。如果saveAsHadoopFile用于GzipCodec创建GzipOutputStream,则该方法负责关闭它。

或者其他流也应该关闭?

与 a 相同GzipOutputStream。调用close()它。

有没有好的选择?

要明确调用 close 吗?

作为替代方案,您可以管理GzipCodec使用try 和 resources创建的流。

但是,如果您问是否有办法避免正确管理流,那么答案是否定的。


如果您实际上遇到了(您认为)由于saveAsHadoopFile未关闭它打开的流而导致的存储泄漏,请提供一个我们可以查看的最小可重现示例。这可能是 Hadoop 中的一个错误……或者您可能使用不正确。


推荐阅读