我想将文件上传到HDFS。我使用以下jar作为依赖项编译我的代码:
我的代码:
我用Ant编译了它。但是,它给了我这个错误:No FileSystem for scheme:hdfs
。
但现在又出现了另一个错误:Class org.apache.hdfs.DistributedFileSystem not found
。
出了什么问题?我该怎么办?
答案 0 :(得分:2)
typename = typename A
是DistributedFileSystem
的一部分。
要解决此问题,您还需要包含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加载类。 因此,如果您使用
设置classLoaderThread.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
可以在日志文件中找到(如果你成功运行了程序并且有日志文件)。在我的例子中如下:
您可以简单地添加所有 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");