速记:
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异常了。
参考文献
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,解决方案