在学mapreduce,看到一个例子,
public class WordCount {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//1.初始化配置
Configuration conf = new Configuration();
//2.创建Job对象
Job wcJob = Job.getInstance(conf);
//3.指定应用程序的目录 最终要把写好的应用程序打好的jar包保存在指定位置
wcJob.setJar("/user/hadoop/worldcount.jar");
//4.指定应用程序类 main方法所在的类
wcJob.setJarByClass(WordCount.class);
//5.指定map工作的类
wcJob.setMapperClass(WordCountMapper.class);
//6.指定reducer工作的类
wcJob.setReducerClass(WordReducer.class);
//7. 设置map阶段输出的key value的类型
wcJob.setMapOutputKeyClass(Text.class);
wcJob.setMapOutputValueClass(IntWritable.class);
//8. 设置reducer阶段 输出的key value类型
wcJob.setOutputKeyClass(Text.class);
wcJob.setOutputValueClass(IntWritable.class);
//9. 设置输入和输出的文件路径
FileInputFormat.setInputPaths(wcJob, new Path("/wordcount/input"));
FileOutputFormat.setOutputPath(wcJob, new Path("/wordcount/output"));
//10. 提交任务
boolean result = wcJob.waitForCompletion(true);
System.exit(result?0:1);
}
}
输出的类型不应该在对应的map和reduce类中规定好了吗?为什么还要再指定一次?
还有如果要指定输出类型,那输入类型为什么不用指定?
因为输出类型可以自定义,不一定是默认的,这样可以加上你要的格式和逻辑。输入不存在这个问题,所以不需要指定
输入和输出的类型不一致
map,reduce的代码也发一下呗