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