这是我的代码段
@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");
}
我正在使用Spark 1.6.1,在我的代码中,我使用了saveAsHadoopFile()
方法,我编写了一个从org.apache.hadoop.mapred.lib.MultipleTextOutputFormat派生的类OutputFormat,并且我覆盖了上面的方法。< / p>
在群集上,它会在输出文件中写入损坏的记录。 我认为这是因为{/ 1}}
BufferedOutputStream
我们可以为FSDataOutputStream fileOut = new FSDataOutputStream(
new BufferedOutputStream(new FileOutputStream(path, true),104857600)), null);
提供任何替代方案,因为它会在缓冲区满了后立即写入。
注意:更新了代码。抱歉给你带来不便。
答案 0 :(得分:0)
我遇到了问题..在集群上,每个工作人员都会尝试写入相同的(共享)文件,因为不同机器上的两个工作者都意味着不同的JVM,因此同步文件写入不会在这里工作。这就是腐败记录的原因。我也使用NFS这是一个重要的因素。