BufferedOutputStream 的替代方案?
Alternative for 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 派生的 class OutputFormat 并覆盖了上述方法。
在集群上,它在输出文件中写入损坏的记录。
我认为这是因为 BufferedOutputStream
在
FSDataOutputStream fileOut = new FSDataOutputStream(
new BufferedOutputStream(new FileOutputStream(path, true),104857600)), null);
我们能否为 bufferedOutputStream
提供任何替代方案,因为它会在缓冲区满时立即写入。
注意:更新了代码。带来不便敬请谅解。
我遇到了问题 .. 在集群上,每个工作人员都将尝试写入相同的(共享)文件,因为不同机器上的两个工作人员意味着不同的 JVM,因此同步文件写入在这里不起作用。这就是腐败记录的原因。我还使用了 NFS,这是重要因素。
这是我的代码片段
@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 派生的 class OutputFormat 并覆盖了上述方法。
在集群上,它在输出文件中写入损坏的记录。
我认为这是因为 BufferedOutputStream
在
FSDataOutputStream fileOut = new FSDataOutputStream(
new BufferedOutputStream(new FileOutputStream(path, true),104857600)), null);
我们能否为 bufferedOutputStream
提供任何替代方案,因为它会在缓冲区满时立即写入。
注意:更新了代码。带来不便敬请谅解。
我遇到了问题 .. 在集群上,每个工作人员都将尝试写入相同的(共享)文件,因为不同机器上的两个工作人员意味着不同的 JVM,因此同步文件写入在这里不起作用。这就是腐败记录的原因。我还使用了 NFS,这是重要因素。