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

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

我们有一个maven项目,其中resources dir中的一些文件被复制到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能够理解的路径。

l0oc07j2

l0oc07j21#

例外 java.io.IOException: No FileSystem for scheme: jar 意味着你不能创建一个 File 对象或打开 FSDataInputStream (驯兽师做的事)用 URI 它引用了 jar 对象。
计划 file 以及 hdfsFileSystem 实现,因此,我想唯一的解决方案为您的情况,因为您想调用 NaiveBayesModel.materialize() ,是将文件转储到 dir 您的目录 jar 变成两个人中的一个 FileSystem 我提到的,然后创建一个 Path 从它那里。
另一方面,您可以尝试重现mahout所做的事情,这是 NaiveBayesModel .
我没有使用mahout的经验,但我想这是一个很好的开始,希望能有所帮助。

相关问题