Java 没有scheme的文件系统:找不到hdfs和类org.apache.hadoop.DistributedFileSystem
我想上传一个文件到HDFS。我使用以下JAR作为依赖项编译代码: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
<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
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客户端