Hadoop FileSystem закрыла исключение при выполнении BufferedReader.close()

В методе "Уменьшить установку" я пытаюсь закрыть объект BufferedReader и получить закрытое исключение FileSystem. Это происходит не всегда. Это кусок кода, который я использовал для создания BufferedReader.

    String fileName = <some HDFS file path>
    Configuration conf = new Configuration();
    FileSystem fs = FileSystem.get(conf);
    Path hdfsPath = new Path(filename);
    FSDataInputStream in = fs.open(hdfsPath);
    InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

Я читаю содержимое из буферизованногоReader, и как только все чтение сделано, я закрываю его.

Это фрагмент кода, который читает его

String line;
while ((line = reader.readLine()) != null) {
    // Do something
}

Это фрагмент кода, который закрывает читателя.

    if (bufferedReader != null) {
        bufferedReader.close();
    }

Это трассировка стека для исключения, которое происходит, когда я делаю bufferedReader.close().

I, [2013-11-18T04: 56: 51.601135 # 25683] INFO -: try_201310111840_142285_r_000009_0: at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:565)

I, [2013-11-18T04: 56: 51.601168 # 25683] INFO -: try_201310111840_142285_r_000009_0: at org.apache.hadoop.hdfs.DFSInputStream.close(DFSInputStream.java:522)

I, [2013-11-18T04: 56: 51.601199 # 25683] INFO -: try_201310111840_142285_r_000009_0: at java.io.FilterInputStream.close(FilterInputStream.java:155)

I, [2013-11-18T04: 56: 51.601230 # 25683] INFO -: try_201310111840_142285_r_000009_0: at sun.nio.cs.StreamDecoder.implClose(StreamDecoder.java:358)

I, [2013-11-18T04: 56: 51.601263 # 25683] INFO -: try_201310111840_142285_r_000009_0: at sun.nio.cs.StreamDecoder.close(StreamDecoder.java:173)

I, [2013-11-18T04: 56: 51.601356 # 25683] INFO -: try_201310111840_142285_r_000009_0: at java.io.InputStreamReader.close(InputStreamReader.java:182)

I, [2013-11-18T04: 56: 51.601395 # 25683] INFO -: try_201310111840_142285_r_000009_0: at java.io.BufferedReader.close(BufferedReader.java:497)

Я не уверен, почему это исключение происходит. Это не многопоточность, и поэтому я не ожидаю, что там будет какое-то соревнование. Не могли бы вы помочь мне понять.

Спасибо,

Venk

Ответ 1

Существует малоизвестный getcha с API файловой системы hasoop: FileSystem.get возвращает тот же объект для каждого вызова с той же файловой системой. Поэтому, если кто-то закрыт где-нибудь, все они закрыты. Вы можете обсудить достоинства этого решения, но так, как оно есть.

Итак, если вы попытаетесь закрыть BufferedReader и попытаетесь очистить некоторые данные, которые он буферизует, но базовый поток подключен к уже существующей файловой системе, вы получите эту ошибку. Проверьте свой код для любых других мест, в которых вы закрываете объект FileSystem, и смотрите условия гонки. Кроме того, я считаю, что сам Hadoop в какой-то момент закроет FileSystem, поэтому, чтобы быть в безопасности, вы, вероятно, должны получить доступ к нему только из методов настройки Reducer, уменьшения или очистки (или настроить, уменьшить и закрыть в зависимости от того, какой API вы используете).

Ответ 2

Вы должны использовать FileSystem.newInstance, чтобы избежать использования общего подключения (как описано Джо К.). Он предоставит вам уникальный, не разделяемый экземпляр.