轉載請註明出處:http://www.codelast.com/java
若是你在程序中(不是一個Hadoop job程序)有讀寫HDFS文件的邏輯,那麼程序運行的時候可能會報下面的錯:apache
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打包的,那麼有幾個可能的緣由是:maven
『1』漏添加了Hadoop的依賴到pom.mxl中
須要的依賴以下:
注意,若是隻有前兩個依賴,那麼程序可能不會有編譯問題,但在運行的時候就會報標題裏所說的錯誤。
文章來源:http://www.codelast.com/
『2』打包不正確
在打出的jar包中,應該在這個路徑下有此文件:META-INF/services/org.apache.hadoop.fs.FileSystem,若是沒有,那麼確定有問題;若是有,那麼也可能有問題。假設你是用 Maven 的 shade 插件來打包的,那麼它在pom.xml中的配置多是這樣的:oop
文章來源:http://www.codelast.com/
若是這樣打出來的包不行,請參考這個連接,在shade插件的「configuraiton」配置段裏面添加這樣一段內容:
而後再試試。
根據個人測試,在我所在的環境下,正確打出來的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包裏的根目錄下。測試