Java 没有scheme的文件系统:找不到hdfs和类org.apache.hadoop.DistributedFileSystem

Java 没有scheme的文件系统:找不到hdfs和类org.apache.hadoop.DistributedFileSystem,java,apache,hadoop,ant,Java,Apache,Hadoop,Ant,我想上传一个文件到HDFS。我使用以下JAR作为依赖项编译代码: <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.1</version> </dependency> <dependency> <g

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

<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>
  • hadoop-auth-2.6.1.jar
  • hadoop-common-2.6.1.jar和
  • hadoop-hdfs-2.6.1.jar
我的代码:

我用Ant编译了它。但是,它给了我这个错误:
scheme:hdfs没有文件系统

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

但现在我遇到了另一个错误:
classorg.apache.hdfs.DistributedFileSystem未找到


怎么了?我该怎么办呢?

分布式文件系统
hadoop核心
的一部分

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


org.apache.hadoop
hadoop内核
1.2.1
总体而言,我使用以下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>

org.apache.hadoop
hadoop通用
2.7.1
org.apache.hadoop
hadoop mapreduce客户端核心
2.7.1
org.apache.hadoop
hadoop内核
1.2.1

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

如果出现以下错误: “方案:hdfs没有文件系统”

您可以通过在配置上设置以下两个属性来解决此问题

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 HDF)加载所需的类


如果你需要更多的帮助,请告诉我。如果您觉得这一点有用,请不要忘记升级投票。

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

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

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

可以在日志文件中找到已使用的相关
jar
(如果您成功运行程序并拥有日志文件)。我的例子如下:

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

一旦在java代码中添加了所有JAR,您可能还需要设置hadoop配置

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

谢谢,我通过使用httpFS+webHDFS解决了这个问题。您可能还需要在构建文件中添加
hadoop hdfs客户端