BufferedOutputStream的替代方案?

时间:2016-10-20 07:53:21

标签: java hadoop apache-spark 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");
    }

我正在使用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); 提供任何替代方案,因为它会在缓冲区满了后立即写入。

注意:更新了代码。抱歉给你带来不便。

1 个答案:

答案 0 :(得分:0)

我遇到了问题..在集群上,每个工作人员都会尝试写入相同的(共享)文件,因为不同机器上的两个工作者都意味着不同的JVM,因此同步文件写入不会在这里工作。这就是腐败记录的原因。我也使用NFS这是一个重要的因素。