mapreduce练习,问下为什么要在主函数中指定输出的key value类型

在学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的代码也发一下呗