IOException с использованием ресурсов источника данных Spring Data Hadoop - PullRequest
0 голосов
/ 05 марта 2012

Всякий раз, когда я указываю ресурс, используя пространство имен Spring Data Hadoop, приложение выдает IOException при загрузке указанного файла.Файл определенно существует и имеет допустимый формат.

Конфигурация Spring Data 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

Ответы [ 2 ]

1 голос
/ 08 апреля 2012

Это было исправлено в сундуке и будет доступно на следующем этапе.См. Весеннее сообщение на форуме [1] для получения дополнительной информации.

[1] http://forum.springsource.org/showthread.php?123777-IOException-when-using-lt-hadoop-configuration-resources-quot

1 голос
/ 28 марта 2012

Крис на самом деле прав.Я столкнулся с подобной проблемой (IOException: поток закрыт), и проблема вызвана чтением из устаревшего потока.Я предполагаю, Диджей, что вы используете что-то вроде этих строк для чтения пользовательского ресурса из вашего classpath:

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

, а затем получаете FileSystem как FileSystem.get(conf).

После расходовиногда с отладчиком похоже, что проблема вызвана комбинацией ConfigurationFactoryBean Spring и Apache Hadoop Configuration объектов.Если вы посмотрите на исходный код Spring Hadoop на github (да, он там доступен), Spring Hadoop будет выглядеть как комбинация Spring Settings и Apache Hadoop API.

Поток ввода открывается в Spring дляпарсит пользовательский ресурс и закрывается после прочтения.Метод get из FileSystem впоследствии перезагружает тот же поток, который уже закрыт, и снова читает, выдавая ошибку IOException: stream closed.

Обходной путь, похожий на примеры на github, заключается в использовании свойств Spring и SpEl (Spring Expression Language) для замены необходимых вам конфигураций на необходимые поля.Другой вариант - написать свой собственный ConfigurationFactoryBean, который создаст новый экземпляр Configuration, используя существующий в качестве родительского и добавив ресурсы в качестве URL-адресов.

Надеюсь, это несколько поможет.

...