☆☆☆★☆☆☆

唯有努力才能活成自己想要活成的样子

导航

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);

 

posted on 2022-03-24 09:33  Yr-Zhang  阅读(1408)  评论(0编辑  收藏  举报