【问题标题】:Hadoop FileSystem closed exception when doing BufferedReader.close()执行 BufferedReader.close() 时 Hadoop FileSystem 关闭异常
【发布时间】:2016-08-09 20:17:49
【问题描述】:

在 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() 时发生的异常的堆栈跟踪。

我,[2013-11-18T04:56:51.601135 #25683] 信息——: 尝试_201310111840_142285_r_000009_0:在 org.apache.hadoop.hdfs.DFSClient.checkOpen(DFSClient.java:565)

我,[2013-11-18T04:56:51.601168 #25683] 信息 -- : 尝试_201310111840_142285_r_000009_0:在 org.apache.hadoop.hdfs.DFSInputStream.close(DFSInputStream.java:522)

我,[2013-11-18T04:56:51.601199 #25683] 信息——: 尝试_201310111840_142285_r_000009_0:在 java.io.FilterInputStream.close(FilterInputStream.java:155)

我,[2013-11-18T04:56:51.601230 #25683] 信息——: 尝试_201310111840_142285_r_000009_0:在 sun.nio.cs.StreamDecoder.implClose(StreamDecoder.java:358)

我,[2013-11-18T04:56:51.601263 #25683] 信息 -- : 尝试_201310111840_142285_r_000009_0:在 sun.nio.cs.StreamDecoder.close(StreamDecoder.java:173)

我,[2013-11-18T04:56:51.601356 #25683] 信息 -- : 尝试_201310111840_142285_r_000009_0:在 java.io.InputStreamReader.close(InputStreamReader.java:182)

我,[2013-11-18T04:56:51.601395 #25683] 信息 -- : 尝试_201310111840_142285_r_000009_0:在 java.io.BufferedReader.close(BufferedReader.java:497)

我不确定为什么会发生此异常。这不是多线程的,所以我不希望有任何形式的竞争条件。你能帮我理解吗?

谢谢,

文克

【问题讨论】:

标签: java hadoop mapreduce hdfs


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您必须使用FileSystem.newInstance 来避免使用共享连接(如 Joe K 所述)。它将为您提供一个独特的、非共享的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-16
      相关资源
      最近更新 更多