Cloudera中WordCount任务执行成功但Reducer输出与Mapper输出一致问题
解决WordCount任务中Reducer输出与Mapper完全一致的问题
嗨,这种情况我碰到好多次了——Reducer输出和Mapper一模一样,本质就是Reducer根本没发挥作用!咱们一步步排查最常见的原因:
1. 驱动类未指定Reducer类
看你贴的驱动代码末尾是org.apache.hadoop.mapreduce.lib.o...,大概率是漏掉了设置Reducer类的关键代码。正常的WordCount驱动必须包含这一行:
job.setReducerClass(WordCountReducer.class);
如果没加这行,Hadoop会默认使用IdentityReducer——这个Reducer啥都不做,直接把Mapper的输出原封不动地输出,结果自然和Mapper完全一致。
2. 误将Reduce任务数设置为0
检查你的驱动代码里有没有这行配置:
job.setNumReduceTasks(0);
如果有这个设置,Hadoop会直接跳过Reduce阶段,把Mapper的输出作为最终结果写入输出目录,这也会导致两者输出一致。
3. 额外检查:Reducer逻辑是否正确(概率较低)
如果上面两个问题都不存在,那得看看你的Reducer类是不是写错了。比如有没有正确实现reduce()方法,完成相同key的value累加逻辑。正确的Reducer示例应该是这样的:
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int total = 0; for (IntWritable count : values) { total += count.get(); } context.write(key, new IntWritable(total)); } }
要是你的Reducer只是直接输出key和单个value,那结果也会和Mapper类似,但这种情况属于逻辑错误,而非Reducer未运行。
先从前两个原因排查,尤其是未指定Reducer类这个新手常踩的坑,应该能解决问题!
内容的提问来源于stack exchange,提问作者Md Firdaus Alam
相关产品推荐
相关产品推荐

