Альтернатива для 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()
метод, для которого я пишу класс OutputFormat, полученный из org.apache.hadoop.mapred.lib.MultipleTextOutputFormat, и перезаписываю вышеуказанный метод.
На кластере он записывает поврежденные записи в выходные файлы. я думаю, что это из-за BufferedOutputStream
в
FSDataOutputStream fileOut = new FSDataOutputStream(
new BufferedOutputStream(new FileOutputStream(path, true),104857600)), null);
Можем ли мы иметь какую-либо альтернативу bufferedOutputStream
, поскольку он пишет, как только буфер заполнится.
Примечание: обновлен код. Приносим извинения за неудобства.
1 ответ
У меня возникла проблема.. в кластере каждый работник будет пытаться записать в один и тот же (общий) файл, так как оба работника на разных машинах означают разные JVM и, следовательно, синхронная запись в файл здесь не работает. вот почему испорченные записи. Также я использовал NFS, который является важным фактором.