3

环境:Hadoop0.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(),这两种方法是什么意思?

4

1 回答 1

3

很可能是。

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

同步点是流中的一个点,如果阅读器“丢失”(例如在寻找流上的任意位置之后),它可以用来与记录边界重新同步。

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

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

哪里outFSDataOutputStream。同样,在同一本书中指出:

HDFS 提供了一种通过sync() on 方法强制所有缓冲区同步到数据节点的方法FSDataOutputStream。在从sync()HDFS 成功调用返回后,保证写入文件中该点的数据将被持久化并且对所有读取器可见。如果发生(客户端或 HDFS)崩溃,数据不会丢失。

但是一个脚注警告要寻找错误HDFS-200,因为上述可见性并不总是得到尊重。

于 2012-09-25T04:24:23.210 回答