java - 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);
解决方案
如果我GzipCodec
正确理解了这个类,它的目的是创建各种压缩器和解压缩器流并将它们返回给调用者。它不负责关闭这些流。那是调用者的责任。
如何关闭一个
GzipOutputStream
?
您只需调用close()
对象。如果saveAsHadoopFile
用于GzipCodec
创建GzipOutputStream
,则该方法负责关闭它。
或者其他流也应该关闭?
与 a 相同GzipOutputStream
。调用close()
它。
有没有好的选择?
要明确调用 close 吗?
作为替代方案,您可以管理GzipCodec
使用try 和 resources创建的流。
但是,如果您问是否有办法避免正确管理流,那么答案是否定的。
如果您实际上遇到了(您认为)由于saveAsHadoopFile
未关闭它打开的流而导致的存储泄漏,请提供一个我们可以查看的最小可重现示例。这可能是 Hadoop 中的一个错误……或者您可能使用不正确。
推荐阅读
- tensorflow2.x - 尝试在 tensorflow2 中连接批量大小不一致的张量
- flutter - Flutter - 以编程方式更新值时滑块不移动
- python - Python将文件夹目录中的多个JSON文件转换为CSV
- python - 如何重复一个函数直到它的返回值匹配它之前的返回值?
- c++11 - 为什么移动分配 std::vector 似乎没有比在此代码中复制有任何性能优势?
- kubernetes - Pod 中可更新字段的扩展
- python - 如何使用 kivy 中给出的字节串播放音频
- verilog - 当我尝试访问另一个模块的输出值时出现 Verilog 错误
- r - 使用多个度量列将数据从宽格式转换为长格式
- flutter - 我如何在颤动的屏幕上共享 appBar 和 bottomNavigation