多个Hadoop文件系统实例

5

我有一个类(为了可读性,我去掉了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));
    }

}

在我的程序中,我首先创建了一个HadoopFileSystem对象,但我没有关闭它。然后我创建了第二个HadoopFileSystem对象,并将其关闭。最后,当我想在第一个对象上使用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();

为什么?

请问您能否发布创建Hadoop文件系统和调用函数的代码?这个类中不太可能包含您正在寻找的错误。 - JREN
我刚刚用我的示例进行了编辑。 - Apaachee
2个回答

10

m_fileSystem = FileSystem.get(l_configuration );即使您创建了两个不同的对象,这也是一个静态调用。 您需要找到一种方法,不要使这个调用对于两个不同的对象都是静态的。

尝试以下方法来解决这个问题,

conf.setBoolean("fs.hdfs.impl.disable.cache", true);

1
谢谢JtheRocker,这解释了一切。你有什么想法可以使它非静态吗? - Apaachee
让我回复你。我会尝试想出一个解决方案。 - SSaikia_JtheRocker
太完美了。让我的一天都变得美好了。 - Apaachee
1
没问题 :) 如果有任何进一步的问题,请查看此链接:https://github.com/shot/hadoop-source-reading/blob/master/src/core/org/apache/hadoop/fs/FileSystem.java - SSaikia_JtheRocker
调用FileSystem.newInstance(...)也是一种解决方案吗? - snooze92
1
@snooze92:我认为是的,在Hadoop 2 API中有这个功能。我之前回答过低于该版本的问题。 - SSaikia_JtheRocker

0

你正在创建一个基于硬编码的配置的对象。这意味着你正在创建两个完全相同的对象。由于这些对象是相同的,JVM会引用同一个对象。所以h1和h2引用同一个对象。

之所以会这样,是因为你正在根据配置文件获取现有对象的实例。如果h1和h2的配置不同,它们将不再是同一个实例。


我使用以下代码进行测试:if(h1 == h2) System.out.println("=="); if(h1.equals(h2)) System.out.println("equals");但是我没有输出结果? - Apaachee
不,我再也没有遇到错误了。h2.close() 也关闭了 h1。我该怎么解决我的问题?为什么 == 没有返回任何东西? - Apaachee
我会更新我的答案,提供另一个修复您的问题的建议。这个方案可行吗?如果不行,那我很抱歉,我已经没有其他想法了:( - JREN
1
@Apaachee,也许你可以从这个链接中获取一些信息。祝你好运,很抱歉我不能为你提供更多帮助。 - JREN
感谢所有JREN,这是一个早期解决方案。 - Apaachee
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接