2012-03-05 16 views
0

SpringデータHadoop名前空間を使用してリソースを指定するときは、指定されたファイルをロードするときにアプリケーションによってIOExceptionがスローされます。ファイルは間違いなく存在し、有効な形式です。Springデータを使用したIOException Hadoopクラスパスリソース

春データ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

スプリングデータのHadoopは、マイルストーン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オブジェクトの組み合わせによって発生しているようです。 Spring Hadoopのソースコードをgithubで見ると(これは利用可能です)、Spring Hadoopはその下にSpring SettingsとApache Hadoop APIの組み合わせのように見えます。

入力ストリームはSpringで開かれ、カスタムリソースを解析し、読み込み後に閉じます。メソッドgetFileSystemは、その後、すでに閉じられている同じストリームをリロードし、再びIOException: stream closedエラーをスローします。

githubの例と同様の回避策は、必要な設定を必要なフィールドに置き換えるために、SpringプロパティとSpEl(Spring Expression Language)を使用することです。もう1つのオプションは、新しいConfigurationインスタンスを親として作成し、リソースをURLとして追加する独自のConfigurationFactoryBeanを作成することです。

これはやや役立ちます。

関連する問題