java.io.IOException: Filesystem closed错误
1.往集群提交任务的时候,需要使用多线程在hdfs上面读取一个资源文件。在读取该资源文件的时候,代码爆出如下异常:
java.io.IOException: Filesystem closed
at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:470)
at org.apache.hadoop.hdfs.DFSInputStream.readWithStrategy(DFSInputStream.java:743)
at org.apache.hadoop.hdfs.DFSInputStream.read(DFSInputStream.java:830)
at java.io.DataInputStream.read(DataInputStream.java:149)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at com.txj.query.orcutil.OrcThreadsWriter.parseFileToOrc(OrcThreadsWriter.java:86)
at com.txj.query.orcutil.OrcThreadsWriter.run(OrcThreadsWriter.java:52)
at java.lang.Thread.run(Thread.java:748)
2.原因:
当任务提交到集群上面以后,多个datanode在getFileSystem过程中,由于Configuration一样,会得到同一个FileSystem。如果有一个datanode在使用完关闭连接,其它的datanode在访问就会出现上述异常。
3.缓存FileSystem实例:
1)FileSystem类中可以通过"fs.%s.impl.disable.cache"来指定是否缓存FileSystem实例(其中%s替换为相应的scheme,比如hdfs、local等)
2)创建了相应的FileSystem实例,这个实例将会保存在缓存中,此后每次get都会获取同一个实例
代码在获取Configuration时需要加入该项配置,保存缓存。
conf.setBoolean("fs.hdfs.impl.disable.cache", true);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能