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()をタイムリーに呼び出す必要がありますが、2つのメソッドはどういう意味ですか?

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
      }
    }

はどこoutですかFSDataOutputStream。繰り返しますが、同じ本の中で次のように述べられています。

HDFS は、 のメソッドを介してすべてのバッファを強制的にデータノードに同期させる方法を提供しsync() ますFSDataOutputStreamsync()HDFSからの呼び出しが成功した後、ファイル内のその時点までに書き込まれたデータが永続化され、すべてのリーダーに表示されることが保証されます。(クライアントまたは HDFS の) クラッシュが発生した場合、データは失われません。

ただし、上記の可視性が常に尊重されるとは限らないため、脚注はHDFS-200のバグに注意するよう警告しています。

于 2012-09-25T04:24:23.210 に答える