問題描述:
hadoop版本:hadoop-2.0.0-cdh4.3.0
在本地環境下能夠找到scheme,但是通過maven打包fatjar 后放到其他機器上就出現找不到scheme。
看了代碼,發現通過FileSystem.get(conf)初始化的時候,要通過靜態加載來實現,其加載類的方法代碼如下:
private static FileSystem createFileSystem(URI uri, Configuration conf
) throws IOException {
Class<?> clazz = conf.getClass("fs." + uri.getScheme() + ".impl", null);
if (clazz == null) {
throw new IOException("No FileSystem for scheme: " + uri.getScheme());
}
FileSystem fs = (FileSystem)ReflectionUtils.newInstance(clazz, conf);
fs.initialize(uri, conf);
return fs;
}
conf.getClass需要讀取hadoop-common-x.jar下面的core-default.xml,但是這個xml里面沒有fs.hdfs.impl的配置信息,所以需要將這個類給配置上去。至於為什么本地環境能夠讀取,看過一部分代碼,我猜測是因為本地環境如果在配置文件中如果找不到就會直接加載默認的方法,但是打包之后默認的方法找不到位置,因為通過maven打包后會將所有的jar包拆包並且jar包的配置也都集合在一個文件中,可能是這里出了問題。
用fatjar的eclipse插件打包的方法也有試過,但是還是會報錯,不過不是hdfs的錯誤了,可能是我的fatjar插件有問題。可以先試試用fatjar插件打包,如果不行的話在用上述辦法。
其實這個錯誤的發生有很多中情況,引用的hadoop jar包的版本兒和服務器上的hadoop版本兒不一樣也有這個問題。所以出現這個問題,先確保你引用的hadoop的jar版本兒和服務器上保持一致。
解決方法:
將hadoop-commom-x.jar里面的core-default.xml文件取出並修改,添加如下代碼:
<property> <name>fs.hdfs.impl</name> <value>org.apache.hadoop.hdfs.DistributedFileSystem</value> <description>The FileSystem for hdfs: uris.</description> </property>
然后再放回jar包中,就可以訪問了,依賴jar包中一定要有hadoop-hdfs.x.jar。
