没有FileSystem for scheme:hdfs和Class org.apache.hadoop.DistributedFileSystem not found

时间:2015-12-22 07:16:47

标签: java apache hadoop ant

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

  • 的hadoop-AUTH-2.6.1.jar,
  • hadoop-common-2.6.1.jar和
  • Hadoop的HDFS-2.6.1.jar,

我的代码:

enter image description here

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

然后我更改了代码并再次编译: enter image description here

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

出了什么问题?我该怎么办?

3 个答案:

答案 0 :(得分:2)

typename = typename ADistributedFileSystem的一部分。

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

hadoop-core-1.2.1.jar

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

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

答案 1 :(得分:0)

在获取如下所示的Hadoop Filesystem对象时 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加载类。 因此,如果您使用

设置classLoader
Thread.currentThread.setContextClassLoader(yourClassLoader); 
configuration.setClassLoader(yourClassLoader);

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

让我知道是否需要更多帮助。而且,如果您觉得有帮助,别忘了投票。

答案 2 :(得分:0)

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

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

就我而言,hdfs 来自 org.apache.hadoop.hdfs.DistributedFileSystem 中的 jar 类:hadoop-hdfs-client-3.2.1.jar

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

enter image description here

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

添加完所有 jar 后,在您的 java 代码中,您可能还需要设置 hadoop 配置

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

enter image description here