2012-09-24 48 views
3

環境:Hadoop的0.20.2-cdh3u5SequenceFile.Writer的sync和syncFs是什麼意思?

我想日誌數據(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()方法明確地),將已上傳的日誌丟失了?

我應該調用同步()或syncFs()及時,因爲這兩種方法是什麼意思?

回答

3

是的,可能。

sync()創建一個同步點。正如書中「Hadoop-權威指南」由湯姆·懷特(Cloudera的)陳述

同步點是數據流中的一個點,可以用來通過 有記錄邊界重新同步,如果讀者「丟失「 - 對於 示例,在查找流中的任意位置後。

現在的syncFS()實現是非常簡單的:

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

其中outFSDataOutputStream。再次,在同一本書指出:

HDFS提供一種方法,用於迫使所有緩衝區上FSDataOutputStream同步到 經由sync()方法的數據節點。 後從sync() HDFS成功調用返回garantees的數據 寫入到文件中的這一點是堅持和大家有目共睹 讀者。在發生客戶端或HDFS崩潰的情況下,數據 不會丟失。

無足輕重警告說看向錯誤HDFS-200,因爲上面提到的知名度並不總是並不總是榮幸。