2016-10-20 11 views
-1

これは私がスパーク1.6.1を使用していますし、私のコードで私はorg.apache.hadoop.mapred.lib.MultipleTextOutputFormatから派生したクラスOUTPUTFORMATを書くいるsaveAsHadoopFile()方法を使用してBufferedOutputStreamの代替品ですか?

@Override 
    protected RecordWriter<String, String> getBaseRecordWriter(
      FileSystem fs, JobConf job, String name, Progressable arg3) 
        throws IOException { 
     Path file2 = FileOutputFormat.getOutputPath(job); 
     String path = file2.toUri().getPath()+File.separator+ name; 
     FSDataOutputStream fileOut = new FSDataOutputStream(new BufferedOutputStream(new FileOutputStream(path, true),104857600)), null); 
     return new LineRecordWriter<String, String>(fileOut, "\t"); 
    } 

私のコードスニペットです私は上記の方法を上書きします。

クラスタでは、出力ファイルに壊れたレコードが書き込まれます。 私はそれはそれは、すぐにバッファがいっぱいになるように書き込むので、BufferedOutputStream

FSDataOutputStream fileOut = new FSDataOutputStream(
       new BufferedOutputStream(new FileOutputStream(path, true),104857600)), null); 

に私たちは、 bufferedOutputStreamのためのあらゆる選択肢を持つことができるためであると考えています。

注:コードを更新しました。ご不便おかけしてすみません。

+2

あなたのコードにはBufferedOutputStreamはありません。データ破損を引き起こしているというあなたの信念の証拠はもちろんです。あなたが何を求めているのか不明確で、XY問題が起こりそうです。 – EJP

+0

BufferedOutputStreamが引き起こす唯一の破損は、切り捨てられたファイルですが、flush()またはclose()に失敗した場合のみです。 –

+0

コードを更新しました。私は異なる組み合わせを試していたので、間違ったものを得ました。 –

答えて

0

私はクラスタでそれぞれのワーカーが異なるマシン上の両方のワーカーが異なるJVMを意味するので、各ワーカーが同じ(共有)ファイルに書き込もうとします。なぜ腐敗した記録なのか?また、私は重要な要素であるNFSを使用しました。