hadoop No FileSystem for scheme: file为什么会发生在我们身上我们如何修复它更新:正确的修复

2022-08-31 09:45:20

我正在尝试使用hadoop运行一个简单的,得到这个错误NaiveBayesClassifer

Exception in thread "main" java.io.IOException: No FileSystem for scheme: file
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1375)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:66)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1390)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:196)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:95)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:180)
    at org.apache.hadoop.fs.Path.getFileSystem(Path.java:175)
    at org.apache.mahout.classifier.naivebayes.NaiveBayesModel.materialize(NaiveBayesModel.java:100)

法典:

    Configuration configuration = new Configuration();
    NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), configuration);// error in this line..

modelPath指向文件,并且配置对象正在打印 -NaiveBayes.binConfiguration: core-default.xml, core-site.xml

我想这是因为罐子,有什么想法吗?


答案 1

这是插件破坏事物的典型案例。maven-assembly

为什么会发生在我们身上

不同的 JAR(for 、for )每个都包含一个不同的文件,该文件被调用到它们的目录中。此文件列出了它们要声明的文件系统实现的规范类名(这称为通过 实现的 Service Provider Interface,请参阅 org.apache.hadoop.FileSystem#loadFileSystems)。hadoop-commonsLocalFileSystemhadoop-hdfsDistributedFileSystemorg.apache.hadoop.fs.FileSystemMETA-INFO/servicesjava.util.ServiceLoader

当我们使用 时,它会将所有 JAR 合并为一个,并且所有 JAR 都会相互覆盖。只剩下其中一个文件(添加的最后一个文件)。在这种情况下,来自 的列表将覆盖 来自 的列表,因此不再声明。maven-assembly-pluginMETA-INFO/services/org.apache.hadoop.fs.FileSystemFileSystemhadoop-commonshadoop-hdfsDistributedFileSystem

我们如何修复它

加载Hadoop配置后,但在做任何相关的事情之前,我们称之为:FileSystem

    hadoopConfig.set("fs.hdfs.impl", 
        org.apache.hadoop.hdfs.DistributedFileSystem.class.getName()
    );
    hadoopConfig.set("fs.file.impl",
        org.apache.hadoop.fs.LocalFileSystem.class.getName()
    );

更新:正确的修复

我注意到有一种基于配置的方法来使用所有服务声明的合并版本,请查看下面的答案krookedkingmaven-assemblyFileSystem


答案 2

对于那些使用 shade 插件的用户,按照 david_p 的建议,您可以通过将 ServicesResourceTransformer 添加到插件配置来合并 shaded jar 中的服务:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.3</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
          </transformers>
        </configuration>
      </execution>
    </executions>
  </plugin>

这会将所有 org.apache.hadoop.fs.FileSystem 服务合并到一个文件中。


推荐