Альтернатива для 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, который является важным фактором.

Другие вопросы по тегам