gpt4 book ai didi

java - 执行 BufferedReader.close() 时 Hadoop FileSystem 关闭异常

转载 作者:太空狗 更新时间:2023-10-29 22:59:24 24 4
gpt4 key购买 nike

在 Reduce 设置方法中,我试图关闭一个 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);

我从 bufferedReader 读取内容,所有读取完成后,我将其关闭。

这是读取它的代码段

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 -- : attempt_201310111840_142285_r_000009_0: at org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:565)

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

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

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

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

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

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

我不确定为什么会出现此异常。这不是多线程的,所以我不希望有任何类型的竞争条件。你能帮我理解一下吗。

谢谢,

文克

最佳答案

hadoop 文件系统 API 有一个鲜为人知的陷阱:FileSystem.get 为同一文件系统的每次调用返回相同的对象。所以如果一个地方在任何地方都关闭了,那么它们就都关闭了。您可以争论这个决定的优点,但事实就是如此。

因此,如果您尝试关闭 BufferedReader,它会尝试清除它缓冲的一些数据,但底层流连接到已关闭的文件系统,您将收到此错误。检查您关闭 FileSystem 对象的任何其他地方的代码,并查找竞争条件。此外,我相信 Hadoop 本身会在某个时候关闭文件系统,因此为了安全起见,您应该只从 Reducer 的设置、减少或清理方法(或配置、减少和关闭,具体取决于哪个 API)中访问它你正在使用)。

关于java - 执行 BufferedReader.close() 时 Hadoop FileSystem 关闭异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20057881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com