Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring数据Hadoop类路径资源的IOException_Java_Spring_Hadoop_Ioexception_Spring Data - Fatal编程技术网

Java 使用Spring数据Hadoop类路径资源的IOException

Java 使用Spring数据Hadoop类路径资源的IOException,java,spring,hadoop,ioexception,spring-data,Java,Spring,Hadoop,Ioexception,Spring Data,每当我使用Spring Data Hadoop命名空间指定资源时,by应用程序在加载指定的文件时抛出一个IOException。该文件确实存在并且格式有效 Spring数据Hadoop XML配置: 启动时堆栈跟踪: Caused by: java.lang.RuntimeException: java.io.IOException: Stream closed at org.apache.hadoop.conf.Configuration.loadResource(Configura

每当我使用Spring Data Hadoop命名空间指定资源时,by应用程序在加载指定的文件时抛出一个
IOException
。该文件确实存在并且格式有效

Spring数据Hadoop XML配置:

启动时堆栈跟踪:

Caused by: java.lang.RuntimeException: java.io.IOException: Stream closed
    at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:1231)
    at org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:1103)
    at org.apache.hadoop.conf.Configuration.getProps(Configuration.java:1037)
    at org.apache.hadoop.conf.Configuration.get(Configuration.java:415)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:860)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1380)
    at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:66)
    at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1404)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:254)
    at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:123)
    at com.mendeley.swets.config.HdfsConfig.fileSystem(HdfsConfig.java:28)
    at com.mendeley.swets.config.HdfsConfig$$EnhancerByCGLIB$$38b1feb7.CGLIB$fileSystem$0(<generated>)
    at com.mendeley.swets.config.HdfsConfig$$EnhancerByCGLIB$$38b1feb7$$FastClassByCGLIB$$3c3c119d.invoke(<generated>)
    at net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:280)
    at com.mendeley.swets.config.HdfsConfig$$EnhancerByCGLIB$$38b1feb7.fileSystem(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:149)
    ... 41 more
Caused by: java.io.IOException: Stream closed
    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:189)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:237)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2932)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:704)
    at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:772)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
    at org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:1162)
    ... 61 more
原因:java.lang.RuntimeException:java.io.IOException:流关闭
位于org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:1231)
位于org.apache.hadoop.conf.Configuration.loadResources(Configuration.java:1103)
位于org.apache.hadoop.conf.Configuration.getProps(Configuration.java:1037)
位于org.apache.hadoop.conf.Configuration.get(Configuration.java:415)
位于org.apache.hadoop.conf.Configuration.getClass(Configuration.java:860)
位于org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1380)
位于org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:66)
位于org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1404)
位于org.apache.hadoop.fs.FileSystem.get(FileSystem.java:254)
位于org.apache.hadoop.fs.FileSystem.get(FileSystem.java:123)
位于com.mendeley.swets.config.HdfsConfig.fileSystem(HdfsConfig.java:28)
位于com.mendeley.swets.config.HdfsConfig$$enhancerbyglib$$38b1feb7.CGLIB$fileSystem$0()
在com.mendeley.swets.config.HdfsConfig$$enhancerbyglib$$38b1feb7$$FastClassByCGLIB$$3C3C3C119D.invoke()上
位于net.sf.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
位于org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:280)
在com.mendeley.swets.config.HdfsConfig$$enhancerbyglib$$38b1feb7.fileSystem()上
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:149)
... 41多
原因:java.io.IOException:流已关闭
位于java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:145)
在java.io.BufferedInputStream.fill处(BufferedInputStream.java:189)
在java.io.BufferedInputStream.read处(BufferedInputStream.java:237)
在com.sun.org.apache.xerces.internal.impl.XMLEntityManager$RewindableInputStream.read(XMLEntityManager.java:2932)
在com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:704)
位于com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:186)
位于com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:772)
位于com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
位于com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
位于com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:235)
位于com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
位于javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
位于org.apache.hadoop.conf.Configuration.loadResource(Configuration.java:1162)
... 61多

克里斯实际上是对的。我遇到了一个类似的问题(IOException:streamclosed),这个问题是由读取过时的流引起的。Deejay,我猜您正在使用以下内容从类路径读取自定义资源:

<hdp:configuration resources="classpath:/custom-site.xml"/>

,然后作为
FileSystem.get(conf)
获取文件系统

在使用调试器之后,问题似乎是由Spring的
ConfigurationFactoryBean
和Apache Hadoop的
Configuration
对象组合引起的。如果您查看github上Spring Hadoop的源代码(是的,在那里可以找到),Spring Hadoop看起来像是Spring设置和Apache Hadoop API的组合

在Spring中打开一个输入流来解析定制资源,并在读取后关闭它。来自
文件系统
的方法
get
随后重新加载已关闭的相同流,并再次读取,抛出
IOException:stream closed
错误

与github上的示例类似,一种解决方法是使用Spring属性和SpEl(Spring表达式语言)来替代必要字段所需的配置。另一个选项可能是编写自己的
ConfigurationFactoryBean
,它将使用现有实例作为父实例创建一个新的
Configuration
实例,并将资源添加为URL


希望这能有所帮助。

这已在主干中修复,将在下一个里程碑中提供。有关更多信息,请参阅spring论坛帖子[1]


[1]

Spring Data Hadoop处于里程碑1中,因此它可能包含问题。你也在Spring论坛上问过吗?@Luciano-我确实问过,但没有回答:(问题-你是在Spring中使用classpath:file.xml符号指定xml文件的吗?我以前遇到过文件系统的问题,在这里输入流被读取一次,然后被再次读取(我忘记了导致这种情况的“完美风暴”情况),导致IOException。