【问题标题】:Multiples Hadoop FileSystem instances多个 Hadoop 文件系统实例
【发布时间】:2013-07-02 08:47:46
【问题描述】:

我有一个类(为了便于阅读,我删除了 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();

为什么?

【问题讨论】:

  • 您能否将代码发布在您创建 HadoopFileSystems 的位置以及调用函数的位置?此类不太可能包含您要查找的错误
  • 我刚刚用我的示例进行了编辑

标签: java hadoop


【解决方案1】:

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

试试这个来解决这个问题,

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

【讨论】:

  • 感谢 JtheRocker,它解释了一切。你有想法让它非静态吗?
  • 让我回复你。我会想办法解决的。
  • 完美。让我开心。
  • 没问题 :) 对于任何进一步的问题,看这个:github.com/shot/hadoop-source-reading/blob/master/src/core/org/…
  • @snooze92:我认为是的,在 Hadoop 2 API 中 :)。我可能为低于该版本的版本回答了这个问题。
【解决方案2】:

您正在基于硬编码的配置创建对象。这基本上意味着您正在创建 2 个相同的对象。因为这些对象是相同的,JVM 将引用同一个对象。所以 h1 和 h2 引用的是同一个对象。

这样做的原因是因为您正在获取基于配置文件的对象的现有实例。如果 h1 和 h2 的配置不同,则不再是同一个实例。

【讨论】:

  • 我测试过:if(h1 == h2) System.out.println("=="); if(h1.equals(h2)) System.out.println("equals");,但我没有“打印”?
  • @Apaachee 你能删除 h2.close();并再次运行它?如果您不先在 h2 上关闭,您还会收到错误吗?
  • 不,我没有再次收到错误。 h2.close() 也关闭了我的 h1。我该如何解决我的问题?为什么==什么都不返回?
  • 我将更新我的答案,并提出另一个解决您问题的建议。那对你有用吗?如果没有,那么我很抱歉,但我没有想法:(
  • @Apaachee comments.gmane.org/gmane.comp.jakarta.lucene.hadoop.user/33042 也许您可以从该链接获得一些信息。祝你好运,对不起,我不能帮助你更多
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 2015-01-20
  • 2013-04-28
  • 2015-06-13
相关资源
最近更新 更多