복붙노트

[HADOOP] BufferedReader.close ()를 수행 할 때 Hadoop FileSystem이 예외를 종료했습니다.

HADOOP

BufferedReader.close ()를 수행 할 때 Hadoop FileSystem이 예외를 종료했습니다.

줄이기 설정 메서드 내에서 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 () 할 때 발생하는 예외에 대한 스택 추적입니다.

왜이 예외가 발생하는지 잘 모르겠습니다. 이것은 다중 스레드가 아니기 때문에 어떤 종류의 경쟁 조건도있을 것으로 기대하지 않습니다. 이해 좀 도와 주시겠습니까?

감사,

일어나세요.

해결법

  1. ==============================

    1.hadoop 파일 시스템 API에는 약간의 알려진 문제가 있습니다. FileSystem.get은 동일한 파일 시스템을 사용하는 모든 호출에 대해 동일한 객체를 반환합니다. 따라서 어느 곳에서나 닫히면 모두 닫힙니다. 이 결정의 장점을 토론 할 수는 있지만 그게 그 방법입니다.

    hadoop 파일 시스템 API에는 약간의 알려진 문제가 있습니다. FileSystem.get은 동일한 파일 시스템을 사용하는 모든 호출에 대해 동일한 객체를 반환합니다. 따라서 어느 곳에서나 닫히면 모두 닫힙니다. 이 결정의 장점을 토론 할 수는 있지만 그게 그 방법입니다.

    따라서 BufferedReader를 닫으려고하면 버퍼링 된 일부 데이터를 플러시하려고 시도하지만 기본 스트림이 이미 닫힌 FileSystem에 연결되어 있으면이 오류가 발생합니다. 코드에서 FileSystem 객체를 닫는 다른 장소를 확인하고 경쟁 조건을 찾습니다. 또한 Hadoop 자체가 FileSystem을 닫을 것이라고 믿습니다. 따라서 Reducer의 설정, 축소 또는 정리 방법 (또는 API에 따라 구성, 축소 및 닫기)에서 액세스해야합니다. 당신이 사용하고 있습니다).

  2. ==============================

    2.Joe K가 설명한 것처럼 공유 연결을 사용하지 않으려면 FileSystem.newInstance를 사용해야합니다. 고유 한 비공유 인스턴스를 제공합니다.

    Joe K가 설명한 것처럼 공유 연결을 사용하지 않으려면 FileSystem.newInstance를 사용해야합니다. 고유 한 비공유 인스턴스를 제공합니다.

  3. from https://stackoverflow.com/questions/20057881/hadoop-filesystem-closed-exception-when-doing-bufferedreader-close by cc-by-sa and MIT license