Hadoop|Hadoop 之 No FileSystem for scheme: hdfs

速记: 1. 场景&报错: Java 代码开发,访问HDFS并写数据,执行可执行jar包报错如下(执行命令:java -jar xxx.jar):

18/03/15 09:39:16 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 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 com.xcar.etl.ApendToHdfs.apend(ApendToHdfs.java:50) at com.xcar.etl.ApendToHdfs.main(ApendToHdfs.java:154)

2. 解决
conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");

详细解释请看参考文献[1]。
虽然异常是不报了,但是仍然有警告如下:
WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

解决办法: 将 java -jar XXX.jar 改为 hadoop jar xxx.jar 命令执行。 因为我们知道执行Hadoop命令时是会自动加载Hadoop相关jar包及配置的,但确保环境变量已配置生效,参见文献[2][3]。
这样,通过Hadoop命令去执行,即使不设置fs.hdfs.impl参数也不会报No FileSystem for scheme异常了。
参考文献 【Hadoop|Hadoop 之 No FileSystem for scheme: hdfs】1. java.io.IOException: No FileSystem for scheme: hdfs
2. Hadoop之Unable to load native-hadoop library问题解决
3. Hadoop出现错误:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable,解决方案

    推荐阅读