使用hadoop FileSystem从本地文件系统中的jar文件中读取

时间:2014-05-05 17:59:12

标签: java maven hadoop io

我们有一个maven项目,其中包含资源目录中的一些文件,这些文件被复制到jar文件的根目录中。我有以下一些代码在JUnit测试期间工作正常,但一旦我尝试从jar执行它就停止工作

        Configuration configuration = new Configuration();
        String pathString = MainClass.class.getClassLoader().getResource("dir").getPath();
        Path path = new Path(pathString);

        logger.debug(path);
        FileSystem fs = path.getFileSystem(configuration);
        if (fs.exists(path)) {
            logger.debug("WOOOOO");
        } else {
            logger.debug("BOOOOO");
        }

测试时,输出为:

DEBUG: /path/to/project/target/test-classes/dir
DEBUG: WOOOOO

从jar运行时我得到:

DEBUG file:/path/to/jar/project.jar!/dir
DEBUG BOOOOO

毋庸置疑,jar文件位于正确的位置,而dir位于该jar的根目录中。

如果你想知道为什么我们这样做,下半部分是一个小测试摘录,它模仿了Mahout中的NaiveBayesModel.materialize()。我们只需要能够创建一个Mahout将理解的路径。

1 个答案:

答案 0 :(得分:1)

异常java.io.IOException: No FileSystem for scheme: jar表示您无法创建File对象或打开FSDataInputStream(Mahout会做什么),URI引用内部内容一个jar对象。

方案filehdfsFileSystem个实现,因此,我认为唯一的解决方案,因为你要调用NaiveBayesModel.materialize(),就是转储文件在dir的{​​{1}}目录中,将其放入我提到的两个jar之一,然后从中创建FileSystem

另一方面,您可以尝试重现what Mahout does,这是Path的实例化。

我没有Mahout的经验,但我想这是一个很好的开始,希望它有所帮助。