【问题标题】:No FileSystem for scheme:hdfs and Class org.apache.hadoop.DistributedFileSystem not found没有方案的文件系统:hdfs 和类 org.apache.hadoop.DistributedFileSystem 未找到
【发布时间】:2015-12-22 07:16:46
【问题描述】:

我想上传一个文件到 HDFS。我使用以下 jar 作为依赖项编译了我的代码:

  • hadoop-auth-2.6.1.jar,
  • hadoop-common-2.6.1.jar 和
  • hadoop-hdfs-2.6.1.jar,

我的代码:

我用 Ant 编译它。但是,它给了我这个错误:No FileSystem for scheme:hdfs

然后我更改了代码并再次编译:

但现在我又遇到了另一个错误:Class org.apache.hdfs.DistributedFileSystem not found

怎么了?我该怎么办?

【问题讨论】:

    标签: java apache hadoop ant


    【解决方案1】:

    DistributedFileSystemhadoop-core 的一部分。

    要解决此问题,您还需要包含hadoop-core-1.2.1.jar(注意:我使用 Maven 进行构建):

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-core</artifactId>
        <version>1.2.1</version>
    </dependency>
    

    总的来说,我正在使用以下 Maven 依赖项:

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.7.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>2.7.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-core</artifactId>
        <version>1.2.1</version>
    </dependency>
    

    【讨论】:

    • 谢谢,我用httpFS+webHDFS解决了这个问题。
    【解决方案2】:

    在获取 Hadoop 文件系统对象时,如下所示 FileSystem fs = FileSystem.get(hdfsUrl,configuration);

    如果您收到以下错误: “方案没有文件系统:hdfs”

    您可以通过在配置中设置以下 2 个属性来解决它。

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

    现在,您可能会收到如下新错误:

    java.lang.ClassNotFoundException: Class org.apache.hadoop.hdfs.DistributedFileSystem not found
    

    Hadoop-common.jar 使用 Thread.currentThread.getContextClassLoader() 和 configuration.getClassLoader 来加载类。 所以,如果你使用

    设置你的类加载器
    Thread.currentThread.setContextClassLoader(yourClassLoader); 
    configuration.setClassLoader(yourClassLoader);
    

    您将能够从其他 hadoop jar(例如 hadoop-hdfs)加载所需的类

    如果您需要更多帮助,请告诉我。如果你觉得这有点用,别忘了点赞。

    【讨论】:

    • 您可能还需要在构建文件中添加hadoop-hdfs-client 作为工件
    【解决方案3】:

    当我将 Java 代码编译成可执行 jar 并运行编译后的 jar 时,我遇到了同样的问题。总是出现一些错误“未找到”(例如,在您的情况下,没有 FileSystem ...),这意味着编译中不包含一些 hadoop jar。

    解决方案是在 Maven/Gradle 中添加正确的依赖项或添加(全部)jar

    在我的例子中,hdfs 来自 org.apache.hadoop.hdfs.DistributedFileSystemjar: hadoop-hdfs-client-3.2.1.jar

    已经使用的相关jars可以在日志文件中找到(如果你成功运行程序并且有日志文件)。在我的示例中如下:

    您可以简单地添加所有 jars(从已安装的 hadoop 文件夹中)。它们应该在 common/hdfs/ ...文件夹下的文件夹中:hadoop 3.2.1/share/hadoop。可能还有其他使用但未显示在日志中的 jar。为了安全起见,只需包括所有罐子。您可以在终端中运行hdfs classpath 来查找所有罐子的位置。

    一旦所有的 jars 添加完毕,在你的 java 代码中,你可能还需要设置 hadoop 配置

            Configuration hadoopConfiguration = new Configuration();
            hadoopConfiguration.addResource(new Path(CoreSiteXMLStr));
            hadoopConfiguration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
    

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2021-05-25
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多