sequencefile.writer的sync和syncfs是什么意思?

eqfvzcg8  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(350)

环境:hadoop 0.20.2-cdh3u5 我正在尝试上传日志数据(10g)到hdfs的自定义工具,使用sequencefile.writer。

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(),这两种方法意味着什么?

wecizke3

wecizke31#

是的,可能。 sync() 创建同步点。正如tom white(cloudera)在《hadoop-权威指南》一书中所说
同步点是流中的一个点,当读卡器“丢失”时(例如,在查找到流上的任意位置之后),它可以用来与记录边界重新同步。
现在实施 syncFS() 很简单:

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

哪里 out 是一个 FSDataOutputStream . 同样地,在同一本书中也提到:
hdfs提供了一种方法,通过 sync() 上的方法 FSDataOutputStream . 成功呼叫后,从 sync() hdfs保证文件中写到该点的数据是持久的,并且对所有读卡器可见。在(客户端或hdfs)崩溃的情况下,数据不会丢失。
但是一个脚注警告我们要关注bug hdfs-200,因为上面提到的可见性并不总是被尊重的。

相关问题