SequenceFile.Writer的sync和syncF是什么意思?

时间:2012-09-24 03:10:59

标签: hadoop hdfs sequencefile

环境:Hadoop 0.20.2-cdh3u5

我正在尝试使用SequenceFile.Writer的自定义工具将日志数据(10G)上传到HDFS。

SequenceFile.Writer w = SequenceFile.createWriter(
                hdfs,
                conf,
                p,
                LongWritable.class,
                Text.class,
                4096,
                hdfs.getDefaultReplication(),
                hdfs.getDefaultBlockSize(),
                compressionType,
                codec,
                null,
                new Metadata());

在上传过程中,如果工具崩溃(没有明确调用close()方法),上传的日志会丢失吗?

我应该及时调用sync()或syncFs(),这两种方法意味着什么?

1 个答案:

答案 0 :(得分:3)

是的,可能。

sync()创建一个同步点。如Tom White(Cloudera)的“Hadoop- The Definitive Guide”一书所述

  

同步点是流可以使用的点   如果读者“丢失”,则与记录边界重新同步 - for   在寻找流上的任意位置之后的例子。

现在syncFS()的实施非常简单:

   public void syncFs() throws IOException {
      if (out != null) {
        out.sync();                               // flush contents to file system
      }
    }

其中outFSDataOutputStream。同样,在同一本书中说明:

  

HDFS提供了一种强制所有缓冲区同步的方法   通过sync()上的FSDataOutputStream方法获取数据节点。后   来自sync() HDFS的成功呼叫返回保证数据   写到文件中的那一点是持久的并且对所有人都可见   读者。在(客户端或HDFS)崩溃的情况下,数据   不会丢失。

但是脚注警告要查看bug HDFS-200,因为上面提到的可见性并不总是得到尊重。