java.io.IOException: No FileSystem for scheme: hdfs
来源:互联网 发布:淘宝晒图内裤爆光图片 编辑:程序博客网 时间:2024/05/21 16:08
java.io.IOException: No FileSystem for scheme: hdfs
在这篇文章中,介绍了如何将Maven依赖的包一起打包进jar包。使用maven-assembly打成jar后,将这个jar提供给其他工程引用的时候,报出如下错误:
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.SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".SLF4J: Defaulting to no-operation (NOP) logger implementationSLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2421) at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2428) at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:88) at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2467) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2449) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:367) at org.apache.hadoop.fs.FileSystem$1.run(FileSystem.java:156) at org.apache.hadoop.fs.FileSystem$1.run(FileSystem.java:153) 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:1491) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:153) at com.cetc.di.HDFSFileSystem.<init>(HDFSFileSystem.java:41) at callhdfs.Main.main(Main.java:11)
但是,在没有打成jar包的工程中,是可以正常运行的,通过长时间的观察和分析,发现与hadoop filesystem相关的包有两个,分别是:hadoop-hdfs-2.7.1.jar和hadoop-common-2.7.1.jar,这两个包的META-INF中的services目录下,都有如下的内容:
可以看到,这两个包的services目录下都有,org.apache.hadoop.fs.FileSystem这个文件。使用Maven-assembly-plugin的时候,会将所有依赖的包unpack,然后在pack,这样就会出现,同样的文件被覆盖的情况,我们看下打好的包中保留的是啥:
可以看到,maven-assembly-plugin(fatjar也是一样的),将hadoop-common.jar中的services内容打进了最终的jar包中,而hadoop-hdfs.jar包中,services的内容被覆盖了。由于我们的函数调用是这样写的:
在函数中使用了hdfs://IP : port的schema,而在生成的最终jar包中,无法找到这个schema的实现。所以就抛出了
java.io.IOException: No FileSystem for scheme: hdfs
解决方案是,在设置hadoop的配置的时候,显示设置这个类:"org.apache.hadoop.hdfs.DistributedFileSystem:
configuration.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem");
然后在重新打包,一切works ok了。
jar包中META-INF中的services文件下的内容,牵涉到servicelocator的概念:
详细的介绍,看java官方文档:http://docs.oracle.com/javase/7/docs/api/java/util/ServiceLoader.html
查看这篇文章,可以知道servicelocator具体是如何运作的http://www.concretepage.com/java/serviceloader-java-example
最近几个项目模块要从hadoop1升级到hadoop2,不过在修改的过程中出现了一些问题,其中一个问题就是在使用 FileSystem fs = FileSystem.get(conf);调用hdfs时报错,具体报错信息如下:
查看FileSystem类发现通过FileSystem.get()初始化的时候,需要通过静态加载的方式来实现,具体实现如下:
从代码中可以看出最终需要调用getFileSystemClass(String scheme, Configuration conf)方法,在此方法中需要读取core-default.xml文件中定义的“fs.” + scheme + ".impl"(在本例中应读取fs.hdfs.impl)的配置信息,但此配置信息在默认的配置文件中没有配置(Hadoop-common-x.jar中的core-default.xml文件中).
------------------------------------------
解决办法:
在配置文件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包后,放到服务器上去执行,程序能够按预期去正确执行,但看到如下错误还是很不爽:
- 2014-08-13 17:16:49 [WARN]-[main]-[org.apache.hadoop.hbase.util.DynamicClassLoader] Failed to identify the fs of dir /tmp/hbase-ecm2/hbase/lib, ignored
- java.io.IOException: No FileSystem for scheme: file
- at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2385) ~[ecm.jar:na]
- at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2392) ~[ecm.jar:na]
- at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:89) ~[ecm.jar:na]
- at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2431) ~[ecm.jar:na]
- at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2413) ~[ecm.jar:na]
- at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:368) ~[ecm.jar:na]
【问题分析:】
eclipse打包完成后,jar包中core-site.xml配置文件中不存在以下两个配置项。
- <property>
- <name>fs.hdfs.impl</name>
- <value>org.apache.hadoop.hdfs.DistributedFileSystem</value>
- <description>The FileSystem for hdfs: uris.</description>
- </property>
- <property>
- <name>fs.file.impl</name>
- <value>org.apache.hadoop.fs.LocalFileSystem</value>
- <description>The FileSystem for hdfs: uris.</description>
- </property>
只要将上面两个配置加到core-site.xml中,然后替换jar包中的xml,重新扔到服务器上,就可以成功运行了。
- java.io.IOException: No FileSystem for scheme: hdfs
- java.io.IOException: No FileSystem for scheme: hdfs异常解决
- java.io.IOException: No FileSystem for scheme: hdfs
- java.io.IOException: No FileSystem for scheme: hdfs
- Java.io.IOException: No FileSystem for scheme: hdfs
- java.io.IOException: No FileSystem for scheme: hdfs
- java.io.IOException: No FileSystem for scheme: hdfs异常解决
- java.io.IOException: No FileSystem for scheme: hdfs
- java.io.IOException: No FileSystem for scheme: hdfs
- java.io.IOException: No FileSystem for scheme: hdfs
- spark程序异常:Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
- java.io.IOException: No FileSystem for scheme: file spark hadoop
- No FileSystem for scheme: hdfs
- No FileSystem for scheme: hdfs
- No FileSystem for scheme: hdfs
- No FileSystem for scheme: hdfs,No FileSystem for scheme: file
- No FileSystem for scheme: hdfs,No FileSystem for scheme: file
- maven将hadoop依赖打包成jar,运行jar后报错 java.io.IOException: No FileSystem for scheme
- Uva 10112 Myacm Triangles
- 实验报告->数组的定义和使用->两路合并法合并两个升序数组
- KNN 算法
- 大数据,物联网,万物互联网,云计算,雾计算,边缘计算的区别和联系
- iBase4j前后台
- java.io.IOException: No FileSystem for scheme: hdfs
- 3-3 对查询结果进行排序
- Cin的用法详解以及文件的读取
- CountDownLatch闭锁
- AngularJs
- [Leetcode] 265. Paint House II 解题报告
- 压缩编码与格式
- Uva 11044 Searching for Nessy
- python-2-重定向输出logging模块