java.io.IOException No FileSystem for scheme hdfs

java.io.IOException: No FileSystem for scheme: hdfs

以下将转载两篇博文,博文中有解决方法。

1.Java下Maven打包项目解决方法

log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
	at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2644)
	at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2651)
	at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:92)
	at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2687)
	at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2669)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:371)
	at org.apache.hadoop.fs.FileSystem$1.run(FileSystem.java:160)
	at org.apache.hadoop.fs.FileSystem$1.run(FileSystem.java:157)
	at java.security.AccessController.doPrivileged(Native Method)
	at javax.security.auth.Subject.doAs(Subject.java:422)
	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:157)
	at com.mytest2.mypro2.App.main(App.java:21)

在一番排查和查阅资料后发现使用Maven-assembly-plugin(fatjar也是一样的)的时候会覆盖相同的文件,然而HDFS的hadoop-hdfs-2.7.1.jar和hadoop-common-2.7.1.jar都有org.apache.hadoop.hdfs.DistributedFileSystem,将会进行覆盖。在运行的过程中使用了hdfs://IP : port的schema,而在生成的最终jar包中,无法找到这个schema的实现。所以就抛出了

解决方案

在代码中加入:

configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");

————————————————
版权声明:本文为CSDN博主「qq_25011427」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_25011427/article/details/84888733

2.如果是python下

工作过程中遇到了这个问题,调用org.apache.hadoop.fs.FileSystem这一套API来对hdfs上面的文件进行操作,但是本地运行正常的代码打包上传到服务器上发现运行会报错Exception in thread “main” java.io.IOException: No FileSystem for scheme: hdfs

经过查阅资料,加上自己排查,发现问题是这样的:

和hadoop filesystem相关的包有以下两个:hadoop-hdfs-xxx.jar和hadoop-common-xxx.jar(xxx是版本),而他们当中都有org.apache.hadoop.fs.FileSystem这个文件。
我们调用的接口是hadoop-hdfs-xxx.jar中的,所以很明显No FileSystem for scheme: hdfs这个问题是因为,相同文件被覆盖了。将hadoop-common-xxx.jar中的services内容打进了最终的jar包中,而hadoop-hdfs-xxx.jar包中,services的内容被覆盖了。
解决办法
解决办法很简单:在设置hadoop的配置的时候,显示设置这个类:"org.apache.hadoop.hdfs.DistributedFileSystem
like this:

var conf: Configuration = new Configuration()
var fs: FileSystem = null

conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem")
fs = FileSystem.get( new URI("hdfs://ip:port"), conf )

重新打包测试,莫得问题了
————————————————
版权声明:本文为CSDN博主「阳呀么阳阳阳」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_32038679/article/details/86481809

猜你喜欢

转载自blog.csdn.net/qq_43203949/article/details/105717234
今日推荐