当前位置: 首页 > 面试题库 >

Java hadoop没有用于方案的文件系统:file

鞠修雅
2023-03-14
问题内容

我正在尝试NaiveBayesClassifer使用hadoop 运行一个简单的程序,出现此错误

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


问题答案:

这是maven-assembly插件破坏事情的典型情况。

为什么这发生在我们身上
不同的JAR(hadoop-commonsfor LocalFileSystem,hadoop-hdfsfor DistributedFileSystem)各自org.apache.hadoop.fs.FileSystem在其META-INFO/services目录中包含一个不同的文件。该文件列出了要声明的文件系统实现的规范类名(这称为通过实现的服务提供者接口java.util.ServiceLoader,请参见org.apache.hadoop.FileSystem#loadFileSystems)。

当使用时maven-assembly-plugin,它将所有的JAR合并为一个,并且全部META-INFO/services/org.apache.hadoop.fs.FileSystem覆盖彼此。这些文件仅保留其中一个(添加的最后一个)。在这种情况下,FileSystemfrom 的列表将hadoop-commons覆盖from 的列表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服务声明的合并版本



 类似资料:
  • 我目前正在开发一个Flink 1.4应用程序,它从Hadoop集群读取一个Avro文件。然而,在我的IDE上以本地模式运行它是非常好的。但当我将其提交给Jobmanager Flink时,它总是失败,并显示以下消息: 我使用官方的Flink Docker image运行集群,该集群应该已经包含Hadoop发行版。 我还试图将依赖项添加到我的应用程序jar中,但这也没有帮助。以下是我的sbt依赖项:

  • 我们在Azure中运行HDInsight集群,但它不允许在集群创建时向上旋转边缘/网关节点。所以我创建这个边缘/网关节点的方法是安装 然后我复制了 但是当我运行时,我得到以下错误 这里是完整的堆栈https://gist.github.com/anonymous/ebb6c9d71865c9c8e125aadbbdd6a5bc 我不确定这里缺少了哪个包/罐子。

  • 提纲mount.ceph monaddr1[,monaddr2,...]:/[subdir] dir [ -o options ] 描述 mount.ceph 是在 Linux 主机上挂载 Ceph 文件系统的简单助手。它只负责把监视器主机名解析为 IP 地址、从硬盘读取认证密钥,大多数实际工作由 Linux 内核客户端组件完成。事实上,无需认证的 Ceph 文件系统无需 mount.ceph 也

  • 我有一个桶,里面有几个小的拼花文件,我想把它们合并成一个更大的文件。 要完成此任务,我想创建一个spark作业来消费并写入一个新文件。 知道怎么了吗?

  • 我正在尝试建立hadoop和Azure存储之间的联系。我已经在这里提到的core-site.xml中添加了属性:Link,仍然得到错误 Scheme:wasb没有文件系统 感谢任何帮助!

  • 请注意:我不是在讨论Java概念或透视图(即文件和文件系统类之间的区别),我是在讨论在HDFS上使用Java.io.File的效果。