Hadoop:未调用reducer
我知道这是一个非常基本的问题,但我无法找到我在哪里犯了错误。我的减速器没有从驱动程序代码中调用。如果有人能帮助我,我将不胜感激 我的驱动程序代码Hadoop:未调用reducer,hadoop,mapreduce,reducers,Hadoop,Mapreduce,Reducers,我知道这是一个非常基本的问题,但我无法找到我在哪里犯了错误。我的减速器没有从驱动程序代码中调用。如果有人能帮助我,我将不胜感激 我的驱动程序代码 package com.mycompany.myorg; 导入java.io.IOException; 导入org.apache.hadoop.conf.Configuration; 导入org.apache.hadoop.fs.Path; 导入org.apache.hadoop.io.IntWritable; 导入org.apache.hadoop.
package com.mycompany.myorg;
导入java.io.IOException;
导入org.apache.hadoop.conf.Configuration;
导入org.apache.hadoop.fs.Path;
导入org.apache.hadoop.io.IntWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Job;
导入org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
导入org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
导入org.apache.hadoop.util.GenericOptionsParser;
公共级汽车驾驶员{
公共静态void main(字符串args[])引发IOException、ClassNotFoundException、InterruptedException{
Configuration conf=新配置();
String[]otherArgs=新的GenericOptionsParser(conf,args);
if(otherArgs.length!=2){
System.err.println(“指定的输入和输出路径不正确”);
系统退出(-1);
}
//设置作业详细信息
作业=新作业(形态,“汽车平均燃油经济性”);
job.setJarByClass(carsDriver.class);
//job.setJobName(“汽车平均燃油经济性”);
//设置MR作业的输入和输出路径
setInputPaths(作业,新路径(args[0]);
setOutputPath(作业,新路径(args[1]);
//映射器、合并器和还原器类的设置
job.setMapperClass(carsMapper.class);
job.setMapOutputKeyClass(Text.class);
setMapOutputValueClass(IntWritable.class);
//job.setCombinerClass(carsCombiner.class);
job.setReducerClass(carsReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
系统退出(作业等待完成(真)?0:1;
}
}
映射器代码
package com.mycompany.myorg;
导入java.io.IOException;
导入org.apache.hadoop.io.IntWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Mapper;
公共类carsMapper扩展映射器{
私有文本映射键=新文本();
私有最终静态IntWritable mapval=新的IntWritable(1);
公共void映射(对象键、文本值、Mapper.Context上下文)引发IOException、InterruptedException{
System.out.println(“运行映射程序”);
字符串项[]=Value.toString().split(“,”);
System.out.println(items[2]+“”+Integer.parseInt(items[23].toString());
mapkey.set(项目[2]);
set(Integer.parseInt(items[23].toString());
write(mapkey,mapval);
}
}
减速器代码
package com.mycompany.myorg;
导入java.io.IOException;
导入org.apache.hadoop.io.IntWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.mapreduce.Reducer;
公共类汽车减速器扩展减速器{
公共void reducer(文本键、Iterable值、reducer.Context上下文)引发IOException、InterruptedException{
System.out.println(“减速机代码”);
Text redKey=新文本();
IntWritable redVal=新的IntWritable();
设置(键);
整数和=0;
整数计数=0;
for(可写入值:值){
sum=sum+val.get();
计数=计数+1;
}
redVal.set((总和/计数));
write(redKey,redVal);
}
}
经过长时间的调试,我发现问题出在reduce override方法上
我曾经
public void reducer
而不是
public void reduce
注意它应该是reduce而不是reducer你确定它没有被调用多少?
syso
语句可能在提交作业的控制台上不可见。共享作业的outputDirectory上显示的hadoop fs-ls
。我对此非常确定,因为我从mapper添加了system.out打印,它可以工作,而从reducer不打印。此外,我甚至试图对reducer的调用和仍然相同的输出进行注释。输出应该是键的平均值,但它只是映射器的结果