解決: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