MultipleOutputFormat в hadoop

Я - новичок в Hadoop. Я испытываю программу Wordcount.

Теперь для испытания нескольких выходных файлов я использую MultipleOutputFormat. эта ссылка помогла мне в выполнении его. http://hadoop.apache.org/common/docs/r0.19.0/api/org/apache/hadoop/mapred/lib/MultipleOutputs.html

в моем классе драйвера я имел

    MultipleOutputs.addNamedOutput(conf, "even",
            org.apache.hadoop.mapred.TextOutputFormat.class, Text.class,
            IntWritable.class);

    MultipleOutputs.addNamedOutput(conf, "odd",
            org.apache.hadoop.mapred.TextOutputFormat.class, Text.class,
            IntWritable.class);`

и мой уменьшать класс стал этим

public static class Reduce extends MapReduceBase implements
        Reducer {
    MultipleOutputs mos = null;

    public void configure(JobConf job) {
        mos = new MultipleOutputs(job);
    }

    public void reduce(Text key, Iterator values,
            OutputCollector output, Reporter reporter)
            throws IOException {
        int sum = 0;
        while (values.hasNext()) {
            sum += values.next().get();
        }
        if (sum % 2 == 0) {
            mos.getCollector("even", reporter).collect(key, new IntWritable(sum));
        }else {
            mos.getCollector("odd", reporter).collect(key, new IntWritable(sum));
        }
        //output.collect(key, new IntWritable(sum));
    }
    @Override
    public void close() throws IOException {
        // TODO Auto-generated method stub
    mos.close();
    }
}

Вещи работали, но я получаю ПАРТИЮ файлов, (одно нечетное и один даже для каждой карты - уменьшают),

Вопрос: То, как у меня может быть всего 2 выходных файла (нечетный и даже) так, чтобы каждый нечетный вывод каждой карты - уменьшил, записано в тот нечетный файл и то же для даже.

16
задан raj 16 August 2010 в 06:42
поделиться

2 ответа

Каждый редуктор использует OutputFormat для записи записей. Вот почему вы получаете набор четных и нечетных файлов для каждого редуктора. Это сделано специально, чтобы каждый редуктор мог выполнять запись параллельно.

Если вам нужен только один нечетный и единственный четный файл, вам нужно установить mapred.reduce.tasks равным 1. Но производительность пострадает, потому что все сопоставители будут использовать один редуктор.

Другой вариант - изменить процесс чтения этих файлов для приема нескольких входных файлов или написать отдельный процесс, объединяющий эти файлы вместе.

3
ответ дан 30 November 2019 в 23:24
поделиться

Несколько файлов вывода будут созданы в зависимости от количества редукторов.

Вы можете использовать hadoop dfs -getmerge для объединения выходных данных

1
ответ дан 30 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: