[原创] 解决Java程序读写HDFS文件的错误:No FileSystem for scheme: hdfs

如果你在程序中(不是一个Hadoop job程序)有读写HDFS文件的逻辑,那么程序运行的时候可能会报下面的错:

Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
        at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2676)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2690)
        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
        at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2733)
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2715)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:382)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:181)
        ......

假设项目是由Maven打包的,那么有几个可能的原因是:

『1』漏添加了Hadoop的依赖到pom.mxl中
需要的依赖如下:

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-common</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
    </dependency>

注意,如果只有前两个依赖,那么程序可能不会有编译问题,但在运行的时候就会报标题里所说的错误。
文章来源:http://www.codelast.com/
『2』打包不正确
在打出的jar包中,应该在这个路径下有此文件:META-INF/services/org.apache.hadoop.fs.FileSystem,如果没有,那么肯定有问题;如果有,那么也可能有问题。假设你是用 Maven 的 shade 插件来打包的,那么它在pom.xml中的配置可能是这样的:

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-shade-plugin</artifactId>

<executions>
  <execution>
    <goals>
      <goal>shade</goal>
    </goals>
    <phase>package</phase>
  </execution>

</executions>

<configuration>
  <filters>
    <filter>
      <artifact>*:*</artifact>
      <excludes>
        <exclude>META-INF/*.SF</exclude>
        <exclude>META-INF/*.DSA</exclude>
        <exclude>META-INF/*.RSA</exclude>
      </excludes>
    </filter>
  </filters>

</configuration>

</plugin>

如果这样打出来的包不行,请参考这个链接,在shade插件的“configuraiton”配置段里面添加这样一段内容:

<transformers>
  <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>

</transformers>

然后再试试。
根据我的测试,在我所在的环境下,正确打出来的jar包中的 META-INF/services/org.apache.hadoop.fs.FileSystem 文件,其大小为 1.9K,如果不加 transformers 那一段配置,打出来的有问题的FileSystem文件的大小为 9百多字节。
文章来源:http://www.codelast.com/
『3』Hadoop集群配置依赖
要能正确读取HDFS文件,程序就需要知道Hadoop集群的配置信息,如果你不是用“hadoop jar”命令来运行你的程序,而是用“java”命令来运行的(例如 java com.codelast.MyProgramme),那么,程序就需要引入Hadoop集群的配置信息。
Hadoop集群的配置保存在 core-site.xml 和 hdfs-site.xml 两个文件中,所以在打包的时候要把它们打到jar包里的根目录下。

文章来源:https://www.codelast.com/
➤➤ 版权声明 ➤➤ 
转载需注明出处:codelast.com 
感谢关注我的微信公众号(微信扫一扫):

wechat qrcode of codelast

发表评论