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

}

私のプログラムでは、私は最初のHadoopFileSysemオブジェクトであり、それを閉じません

次に、2 番目の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();

なんで ?

4

2 に答える 2

10

m_fileSystem = FileSystem.get(l_configuration );2 つの異なるオブジェクトを作成した場合でも、静的呼び出しです。この呼び出しを 2 つの異なるオブジェクトに対して静的にしない方法を見つける必要があります。

問題を解決するためにこれを試してください。

conf.setBoolean("fs.hdfs.impl.disable.cache", true);
于 2013-07-02T09:34:49.530 に答える
0

ハードコーディングされた構成に基づいてオブジェクトを作成しています。これは基本的に、2 つの同一のオブジェクトを作成していることを意味します。これらのオブジェクトは同一であるため、JVM は同じオブジェクトを参照します。したがって、h1 と h2 は同じオブジェクトを参照しています。

これは、構成ファイルに基づいてオブジェクトの既存のインスタンスを取得しているためです。h1 と h2 の構成が異なる場合、同じインスタンスではなくなります。

于 2013-07-02T08:55:50.520 に答える