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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM