多个hadoop文件系统示例

cqoc49vn  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(314)

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

为什么?

vawmfj5a

vawmfj5a1#

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

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

ffscu2ro2#

您正在基于硬编码的配置创建对象。这基本上意味着要创建两个相同的对象。因为这些对象是相同的,所以jvm将引用相同的对象。所以h1和h2引用的是同一个对象。
这是因为您正在基于配置文件获取对象的现有示例。如果h1和h2的配置不同,它将不再是同一个示例。

相关问题