2012-03-05 2 views
0

Spring 데이터 Hadoop 네임 스페이스를 사용하여 리소스를 지정할 때마다 응용 프로그램은 지정된 파일을로드 할 때 IOException을 발생시킵니다. 파일이 존재하며 유효한 형식입니다.Spring 데이터를 사용하는 IOException 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 
+0

스프링 데이터 하둡 마일스톤 1이므로 문제가 포함될 수있다. 스프링 포럼에서도 물어 보았습니까? – Luciano

+0

@Luciano - 실제로했으나 응답이 없습니다. ( –

+0

질문 - Spring의 classpath : file.xml 표기법을 사용하여 xml 파일을 지정하고 있습니까? FileStream에 대한 문제가 발생하여 InputStream을 한 번 읽은 다음 읽을 수 있습니다. 다시 (IOException을 일으키는 원인이되는 '완벽한 폭풍우'상황을 잊어 버립니다.) –

답변

1

크리스가 실제로 권리입니다. 유사한 문제 (IOException : 스트림이 닫힌 상태)가 발생하여 부실 스트림에서 읽음으로써 문제가 발생합니다.

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

을하고 FileSystem.get(conf)으로 파일 시스템을 획득 : 나는 당신이 당신의 클래스 경로에서 사용자 정의 자원을 읽기 위해이 라인을 따라 뭔가를 사용하고 있는지, 디제이 추측하고있다.

디버거로 언젠가 소비 한 후, 문제는 Spring의 ConfigurationFactoryBean과 Apache Hadoop의 Configuration 개체의 조합으로 발생합니다. github에서 Spring Hadoop의 소스 코드를 보면 Spring Hadoop은 Spring Settings와 Apache Hadoop API의 조합처럼 보입니다.

사용자 정의 자원을 구문 분석하기 위해 입력 스트림이 Spring에서 열리고 읽은 후 닫힙니다. 메서드 get, FileSystem은 이후에 이미 닫힌 동일한 스트림을 다시로드하고 IOException: stream closed 오류를 다시 읽습니다.

github의 예제와 비슷한 해결 방법은 필요한 필드에 필요한 구성을 Spring 속성 및 SpEl (Spring Expression Language)을 사용하여 대체하는 것입니다. 다른 옵션은 아마도 자신의 ConfigurationFactoryBean을 새로 작성하여 새로운 Configuration 인스턴스를 생성하고 인스턴스를 부모로 사용하고 자원을 URL로 추가하는 것입니다.

희망이 다소 도움이됩니다.

관련 문제