2011-11-01 3 views
1

hadoop 파일 시스템에 쓰고 있습니다. 그러나 내가 추가 할 때마다 기존 데이터/파일에 데이터를 추가하는 대신 데이터를 덮어 씁니다. 이 작업을 수행하는 코드는 다음과 같습니다. 이 코드는 여러 데이터에 대해 반복해서 호출됩니다. 문제가 발생할 때마다 새로운 SequenceFile.Writer를 여는 중입니까?HDFS에 쓰기 : 파일을 덮어 씁니다.

내가 새 경로 ("someDir")로 경로를 가져올 때마다;

public void writeToHDFS(Path path, long uniqueId, String data){ 
     FileSystem fs = path.getFileSystem(conf); 
     SequenceFile.Writer inputWriter = new SequenceFile.Writer(fs, conf, 
      path, LongWritable.class, MyWritable.class); 
     inputWriter.append(new LongWritable(uniqueId++), new MyWritable(data)); 
     inputWriter.close(); 
    } 
+0

레코드를 입력하고 직접 닫을 때 시퀀스 파일을 사용하는 것을 볼 수 없습니다. 파일을 열어두고 계속 추가하십시오. –

답변

3

현재 API를 통해 기존 SequenceFile에 추가 할 수있는 방법이 없습니다. 새 SequenceFile.Writer 개체를 만들면 해당 파일은 Path에 기존 파일에 추가되지 않고 대신 덮어 씁니다. 내 earlier question을 참조하십시오.

Thomas가 지적한 것처럼 동일한 SequenceFile.Writer 개체를 유지하면 close()에 전화 할 때까지 파일에 추가 할 수 있습니다.

+0

무작위로 쓸 경로가 너무 많으면 어떻게해야합니까? SequenceFile.Writer를 많이 열어 둘 수 있습니까? – TheHat

+0

'SequenceFile.Writer'에는 flush 메소드가 없기 때문에, 모든 내용은 닫을 때까지 메모리에 저장됩니다. 따라서 많은 작가들이 열린 상태로 유지하는 것은 규모가 조정되지 않습니다. 문제가 MapReduce에 적합하다면 SequenceFileOutputFormat을 사용하여 MapReduce 작업을 생성하여 SequenceFile을 생성하는 것이 좋습니다. –

+0

키 값을 쓰는 데 FSDataOutputStream을 사용할 수 있습니까? write key.getBytes {space} value.getBytes {newline}는 SequenceFile.Writer의 append와 비슷합니까? – TheHat

관련 문제