java - hdfs append




HDFS Java의 기존 파일에 데이터 추가 (2)

HDFS에서 기존 파일에 데이터를 추가하는 데 문제가 있습니다. 나는 그 파일이 존재한다면 줄을 추가하고 그렇지 않다면 주어진 이름으로 새로운 파일을 생성하기를 원한다.

HDFS에 기록하는 방법은 다음과 같습니다.

if (!file.exists(path)){
   file.createNewFile(path);
}

FSDataOutputStream fileOutputStream = file.append(path); 
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
br.append("Content: " + content + "\n");
br.close();

실제로이 방법은 HDFS에 쓴다.하지만 파일을 만들지 만 언급하지는 않는다.

이것이 내 방법을 테스트하는 방법입니다.

RunTimeCalculationHdfsWrite.hdfsWriteFile("RunTimeParserLoaderMapperTest2", "Error message test 2.2", context, null);

첫 번째 매개 변수는 파일의 이름이고 두 번째 매개 변수는 다른 매개 변수는 중요하지 않습니다.

누구나 제가 누락되거나 잘못하고있는 것에 대한 아이디어를 가지고 있습니까?


HDFS는 append 작업을 허용하지 않습니다. 추가 기능과 동일한 기능을 구현하는 한 가지 방법은 다음과 같습니다.

  • 파일이 있는지 확인하십시오.
  • 파일이 존재하지 않으면 새 파일을 만들고 새 파일에 쓰십시오
  • 파일이 있으면 임시 파일을 작성하십시오.
  • 원래 파일의 행을 읽고 같은 줄을 임시 파일에 씁니다 (줄 바꿈을 잊지 마십시오).
  • 임시 파일에 추가하려는 행을 작성하십시오.
  • 마지막으로 원본 파일을 삭제하고 임시 파일을 원래 파일로 이동 (이름 바꾸기)하십시오.

실제로 HDFS 파일에 추가 할 수 있습니다.

Client의 관점에서, append 연산은 먼저 DistributedFileSystem의 append를 호출하고,이 연산은 stream 객체 FSDataOutputStream을 반환합니다. 클라이언트가이 파일에 데이터를 추가해야하는 경우 out.write를 작성하여 작성하고 out.close를 호출하여 닫을 수 있습니다.

HDFS 소스를 확인한 결과, DistributedFileSystem#append 메소드가 있습니다.

 FSDataOutputStream append(Path f, final int bufferSize, final Progressable progress) throws IOException

자세한 내용은 slideshare.net/dataera/inside-hdfs-append 참조하십시오.

또한 명령 줄을 통해 추가 할 수도 있습니다.

hdfs dfs -appendToFile <localsrc> ... <dst>

stdin에서 직접 행 추가 :

echo "Line-to-add" | hdfs dfs -appendToFile - <dst>






filewriter