Я - новичок в 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 выходных файла (нечетный и даже) так, чтобы каждый нечетный вывод каждой карты - уменьшил, записано в тот нечетный файл и то же для даже.
Каждый редуктор использует OutputFormat для записи записей. Вот почему вы получаете набор четных и нечетных файлов для каждого редуктора. Это сделано специально, чтобы каждый редуктор мог выполнять запись параллельно.
Если вам нужен только один нечетный и единственный четный файл, вам нужно установить mapred.reduce.tasks равным 1. Но производительность пострадает, потому что все сопоставители будут использовать один редуктор.
Другой вариант - изменить процесс чтения этих файлов для приема нескольких входных файлов или написать отдельный процесс, объединяющий эти файлы вместе.
Несколько файлов вывода будут созданы в зависимости от количества редукторов.
Вы можете использовать hadoop dfs -getmerge для объединения выходных данных