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
, чтобы избежать использования общего подключения (как описано Джо К.). Он предоставит вам уникальный, не разделяемый экземпляр.