2011-11-01 73 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

当你把一条记录放入并直接关闭它时,我没有看到使用sequencefile。保持文件打开并不断追加。 –

回答

3

目前没有办法通过API追加到现有的SequenceFile。当您创建新的SequenceFile.Writer对象时,它不会追加到Path处的现有文件,而是覆盖它。请参阅我的earlier question

正如Thomas指出的那样,如果您保留相同的SequenceFile.Writer对象,您将能够附加到该文件,直到您致电close()

+0

如果我有太多随机写入的路径,该怎么办?我可以保留很多SequenceFile.Writer吗? – TheHat

+0

由于'SequenceFile.Writer'没有flush方法,所以它的所有内容都会在内存中,直到你关闭它们。所以,保持许多作家开放不会扩展。如果问题适用于MapReduce,那么使用SequenceFileOutputFormat创建一个MapReduce作业来构建SequenceFiles也许是有意义的。 –

+0

可以使用FSDataOutputStream来写入密钥值吗?将写入key.getBytes {空间} value.getBytes {newline}是否类似于SequenceFile.Writer的追加? – TheHat