zoukankan      html  css  js  c++  java
  • java.io.IOException: No FileSystem for scheme: hdfs

    转自:http://www.cnblogs.com/justinzhang/p/4983673.html

    介绍了如何将Maven依赖的包一起打包进jar包。使用maven-assembly打成jar后,将这个jar提供给其他工程引用的时候,报出如下错误:

    复制代码
    log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
    log4j:WARN Please initialize the log4j system properly.
    log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
    SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    SLF4J: Defaulting to no-operation (NOP) logger implementation
    SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
    Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
         at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2421)
         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2428)
         at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:88)
         at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2467)
         at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2449)
         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:367)
         at org.apache.hadoop.fs.FileSystem$1.run(FileSystem.java:156)
         at org.apache.hadoop.fs.FileSystem$1.run(FileSystem.java:153)
         at java.security.AccessController.doPrivileged(Native Method)
         at javax.security.auth.Subject.doAs(Subject.java:422)
         at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491)
         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:153)
         at com.cetc.di.HDFSFileSystem.<init>(HDFSFileSystem.java:41)
         at callhdfs.Main.main(Main.java:11)
    复制代码

    但是,在没有打成jar包的工程中,是可以正常运行的,通过长时间的观察和分析,发现与hadoop filesystem相关的包有两个,分别是:hadoop-hdfs-2.7.1.jar和hadoop-common-2.7.1.jar,这两个包的META-INF中的services目录下,都有如下的内容:

    image

    image

    可以看到,这两个包的services目录下都有,org.apache.hadoop.fs.FileSystem这个文件。使用Maven-assembly-plugin的时候,会将所有依赖的包unpack,然后在pack,这样就会出现,同样的文件被覆盖的情况,我们看下打好的包中保留的是啥:

    image

    可以看到,maven-assembly-plugin(fatjar也是一样的),将hadoop-common.jar中的services内容打进了最终的jar包中,而hadoop-hdfs.jar包中,services的内容被覆盖了。由于我们的函数调用是这样写的:

    image  image

    在函数中使用了hdfs://IP : port的schema,而在生成的最终jar包中,无法找到这个schema的实现。所以就抛出了

    java.io.IOException: No FileSystem for scheme: hdfs

    解决方案是,在设置hadoop的配置的时候,显示设置这个类:"org.apache.hadoop.hdfs.DistributedFileSystem:

    configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");

    image

    然后在重新打包,一切works ok了。

    jar包中META-INF中的services文件下的内容,牵涉到servicelocator的概念:

    image

    详细的介绍,看java官方文档:http://docs.oracle.com/javase/7/docs/api/java/util/ServiceLoader.html

    查看这篇文章,可以知道servicelocator具体是如何运作的http://www.concretepage.com/java/serviceloader-java-example 

     

  • 相关阅读:
    性能测试培训:性能瓶颈分析思路
    (国内)完美下载Android源码Ubuntu版
    (国内)完美下载android源代码(文章已经丢失)
    【翻译】Ext JS最新技巧——2015-10-21
    ubuntu 中 eclipse 的菜单栏 显示问题
    谷歌代码库已超过 20 亿行代码,他们是如何管理的?
    架构方面的资料集锦
    Android Studio 使用 Gradle 打包 Jar
    【翻译】Ext JS最新技巧——2015-8-11
    【翻译】在Ext JS 6通用应用程序中使用既共享又特定于视图的代码
  • 原文地址:https://www.cnblogs.com/seaspring/p/5957146.html
Copyright © 2011-2022 走看看