我是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<Text, IntWritable, Text, IntWritable> {
MultipleOutputs mos = null;
public void configure(JobConf job) {
mos = new MultipleOutputs(job);
}
public void reduce(Text key, Iterator<IntWritable> values,
OutputCollector<Text, IntWritable> 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();
}
}
事情的工作,但我得到很多文件,(一个奇数和一个偶数为每个Map减少)
问题是:我怎么能只有2个输出文件(奇数和偶数),使每一个奇数输出的每一个Map减少得到写入到奇数文件,并为偶数相同。
4条答案
按热度按时间czq61nw11#
每个Reducer都使用OutputFormat来写入记录。这就是为什么每个Reducer都有一组奇数和偶数文件的原因。这是设计好的,这样每个Reducer都可以并行执行写入操作。
如果只需要一个奇数和一个偶数文件,则需要将mapred.reduce.tasks设置为1。但是性能会受到影响,因为所有Map器都将输入到一个reducer中。
另一个选择是更改读取这些文件的进程以接受多个输入文件,或者编写一个单独的进程将这些文件合并在一起。
dvtswwa32#
我为此写了一个类。用它来做你的工作:
这是我的课:
raogr8fs3#
将根据减速器的数量生成多个输出文件。
您可以使用hadoop dfs -getmerge来合并输出。
olqngx594#
您可以尝试更改输出文件名(Reducer输出),因为HDFS仅支持附加操作,那么它将从所有Reducer中收集所有Temp-r-0000 x文件(分区),并将它们放在一个文件中。
这里是您需要创建的类,它将覆盖TextOutputFormat中的方法:
然后选择还原器/Map器:
然后在“作业配置: