java - hadoop No FileSystem for scheme : file

标签 java hadoop io

我正在尝试使用 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.bin 文件,配置对象正在打印 - Configuration: core-default.xml, core-site.xml

我认为是因为 jar ,有什么想法吗?

最佳答案

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

为什么这会发生在我们身上

不同的 JAR(hadoop-commons 用于 LocalFileSystemhadoop-hdfs 用于 DistributedFileSystem)每个都包含不同的在他们的 META-INFO/services 目录中名为 org.apache.hadoop.fs.FileSystem 的文件。该文件列出了他们想要声明的文件系统实现的规范类名(这称为通过 java.util.ServiceLoader 实现的服务提供者接口(interface),参见 org.apache.hadoop.FileSystem#loadFileSystems)。

当我们使用 maven-assembly-plugin 时,它会将我们所有的 JAR 合并为一个,以及所有 META-INFO/services/org.apache.hadoop.fs.FileSystem 互相覆盖。这些文件中只剩下一个(最后一个添加的文件)。在这种情况下,来自 hadoop-commonsFileSystem 列表会覆盖来自 hadoop-hdfs 的列表,因此 DistributedFileSystem 是不再声明。

我们如何修复它

在加载 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()
    );

更新:正确修复

krookedking 引起我的注意,有一种基于配置的方法可以使 maven-assembly 使用所有 的合并版本FileSystem 服务声明,查看 his answer下面。

关于java - hadoop No FileSystem for scheme : file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17265002/

相关文章:

java - java中日期时区格式的转换

hadoop - hive hadoop 上可用的数据可视化工具

java - Java 8 流中的本地存储

java - 如何解决 for-loop 中的 SonarQube 提示者?

java - 信息 : Transport Used for JDBC connection: null + Apache Hive

c++ - C++ 中的流式 I/O

java - 在 Windows 系统上构建 UNIX 路径字符串

java - 如何删除另一个线程正在使用的文件?

java - 在java中将TIF图像添加到Jlist或Frame中

csv - 使用Apache Pig将数据加载到Hbase表时,如何排除csv或文本文件中某行中没有数据(仅空白)的列?