解决:java.io.IOException: No FileSystem for scheme: hdfsjava
开发项目初期,写完代码开始放到服务器上开始测试的时候,报出这样的一个错,不知道怎么处理了,尝试了从新配置HDFS的Configuration,也不行,无奈之下,只好查看源代码,分析错误是从哪里里报出来的。服务器
首先把hadoop-common-2.6.0-cdh5.7.0这个jar包解压,按照报错的类,找到对应的方法,使用反编译工具打开FileSystem这个类,查看里面的源代码实现,首先看get方法:工具
这个get方法里面有建立FileSystem的方法,createFileSystem就是用来建立FileSystem的,报错的可能性,只能在这个方法里,由于这个方法在读取咱们的配置文件,也就是Configuration。咱们打开createFileSystem这个方法继续跟踪源码的实现过程:oop
从这个方法中,咱们能够看到报错的信息以及什么状况下他会报出这样的错误,知道了源头后,咱们的问题就好解决多了,从代码中能够看到,当Class classz为空的时候就报No FileSystem for scheme 这个错误,在往上看,这个对象是由getFileSystemClass这个方法建立返回的,咱们再打开这个方法:测试
看到这里发现问题了,这个方法须要读取core-default.xml中定义的“fs.”+scheme+”.impl”,这里是读取fs.hdfs.impl这个配置信息,这个信息在配置文件core-default.xml中没有配置,所以会报错,咱们找到这个配置文件:spa
打开这个配置文件,翻到最后发现没有相关的配置,加入指定实现类配置便可,加入这几句话:xml
这样读取配置文件,加载类就能够了,从新测试,问题获得解决。对象
总结:发生这个错误的缘由在于在开发过程当中,项目Hadoop版本进行了升级,旧版本的jar包中没有这个方法的实现类配置,因此找不到。由于开始的时候导入的是咱们上一个项目的jar包,全部仍是不能懒,导入对应新版本的jar包就能够了。另外,在遇到问题的时候不要着急,先找出可能的解决方法仔,实在不行,查看源码,细找出问题的根源,顺藤摸瓜,一步步找出缘由,问题才能顺利解决。blog