我有一个类(为了便于阅读,我删除了try / catch):
public class HadoopFileSystem {
private FileSystem m_fileSystem = null;
public HadoopFileSystem() {
Configuration l_configuration = new Configuration();
l_configuration .set("fs.default.name", "hdfs://localhost:9100");
l_configuration .set("mapred.job.tracker", "localhost:9101");
m_fileSystem = FileSystem.get(l_configuration );
}
public void close() {
m_fileSystem.close();
}
public void createFile(String a_pathDFS) {
m_fileSystem.create(new Path(a_pathDFS));
}
}
在我的计划中,我是第一个HadoopFileSysem
对象,我不关闭它。
然后我创建了第二个HadoopFileSysem
对象,然后关闭它。
最后,当我想在我的第一个对象中使用m_fileSystem
上的函数时,我收到错误:java.io.IOException: Filesystem closed
但我没有关闭它!
这里有一些代码来说明我的问题:
HadoopFileSystem h1 = new HadoopFileSystem();
HadoopFileSystem h2 = new HadoopFileSystem();
if(h1 == h2)
System.out.println("=="); // No print
if(h1.equals(h2))
System.out.println("equals"); // No print
h2.close();
h1.createFile("test.test"); // ERROR : java.io.IOException: Filesystem closed
h1.close();
为什么?
答案 0 :(得分:10)
m_fileSystem = FileSystem.get(l_configuration );
也是一个静态调用。您需要找到一种方法不使这个调用对两个不同的对象保持静态。
试试这个以解决问题,
conf.setBoolean("fs.hdfs.impl.disable.cache", true);
答案 1 :(得分:1)
您正在基于硬编码的配置创建对象。这基本上意味着您要创建2个相同的对象。因为这些对象是相同的,所以JVM将引用同一个对象。所以h1和h2引用了同一个对象。
原因是您正在根据配置文件获取对象的现有实例。如果h1和h2的配置不同,则它将不再是同一个实例。