Java 多个Hadoop文件系统实例
我有一个类(为了可读性,我删除了try/catch): 在我的程序中,我首先创建了一个Java 多个Hadoop文件系统实例,java,hadoop,Java,Hadoop,我有一个类(为了可读性,我删除了try/catch): 在我的程序中,我首先创建了一个HadoopFileSysem对象,我没有关闭它 然后我创建第二个HadoopFileSysem对象,然后关闭它 最后,当我想在我的第一个对象中使用m_fileSystem上的函数时,我有一个错误:java.io.IOException:fileSystem closed 但我没关! 下面是一个小代码来说明我的问题: HadoopFileSystem h1 = new HadoopFileSystem(); H
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();
为什么?您正在基于硬编码的配置创建对象。这基本上意味着要创建两个相同的对象。因为这些对象是相同的,所以JVM将引用相同的对象。所以h1和h2引用的是同一个对象
这样做的原因是,您将获得一个基于配置文件的对象的现有实例。如果h1和h2的配置不同,它将不再是同一个实例。
m\u fileSystem=fileSystem.get(l\u配置)代码>是一个静态调用,即使创建了两个不同的对象。您需要找到一种方法,使两个不同对象的调用保持静态
试试这个来解决这个问题
conf.setBoolean("fs.hdfs.impl.disable.cache", true);
你能把代码贴在创建Hadoop文件系统和调用函数的地方吗?这个类不太可能包含您正在查找的错误。我刚刚用示例编辑了我的测试:if(h1==h2)System.out.println(“==”);如果(h1等于(h2))系统输出println(“等于”)代码>和我没有“打印”?@apachee你能删除h2.close()吗;然后再运行一次?如果不先关闭h2,是否仍会出现错误?不,我不会再出现错误。h2.close()。我怎样才能解决我的问题?为什么==
什么也不返回?我会用另一个解决问题的建议更新我的答案。这对你有用吗?如果没有,那么我很抱歉,但是我没有主意了:(@apaache也许你可以从那个链接中获得一些信息。祝你好运,对不起,我帮不了你更多的忙。谢谢JtheRocker,这就解释了一切。你有没有办法让它成为非静态的?让我给你回电话。我会想办法的。很好。让我开心。没问题:)对于任何进一步的问题,请看这个:@snooze92:我想是的,在Hadoop2API中:)。我回答了以下可能的版本。
conf.setBoolean("fs.hdfs.impl.disable.cache", true);