在学习Hadoop阶段数据的MR通常都是单MR,下面我给大家用一个例子演示一下在工作中正常写的时候怎么写多层MR嵌套
单MR写法:
public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException {
Configuration cfg = new Configuration();
//获取到任务
Job job = Job.getInstance(cfg);
job.setJarByClass(OrderDirver.class);
//对输入输出参数设置
// Text, IntWritable
job.setOutputKeyClass(OrderBean.class);
job.setOutputValueClass(NullWritable.class);
job.setMapOutputKeyClass(OrderBean.class);
job.setMapOutputValueClass(NullWritable.class);
//设置map reduce类
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
//设置输入输出路径
FileInputFormat.setInputPaths( job , new Path("D:\\a\\input"));
FileOutputFormat.setOutputPath( job , new Path("D:\\a\\output"));
boolean b = job.waitForCompletion(true);
System.exit(b == true ? 0 : -1);
}
多MR嵌套:
public static void main(String[] args) throws InterruptedException, IOException, ClassNotFoundException {
Configuration cfg = new Configuration();
//获取到任务
Job job = Job.getInstance(cfg);
job.setJarByClass(OrderDirver.class);
//对输入输出参数设置
job.setOutputKeyClass(OrderBean.class);
job.setOutputValueClass(NullWritable.class);
job.setMapOutputKeyClass(OrderBean.class);
job.setMapOutputValueClass(NullWritable.class);
//设置map reduce类
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
//设置输入输出路径
FileInputFormat.setInputPaths( job , new Path("D:\\a\\input"));
FileOutputFormat.setOutputPath( job , new Path("D:\\a\\output"));
boolean b = job.waitForCompletion(true);
//第一个重点在这里:原来是如果任务成功就退出,现在直接进行下一次计算
if(b==true){
//重点二在这里:所有的对象最好不要使用同一个,或者把对象以类成员的形式提出去也行
Configuration cfg1 = new Configuration();
//获取到任务
Job job1 = Job.getInstance(cfg);
job1.setJarByClass(OrderDirver.class);
//对输入输出参数设置
job1.setOutputKeyClass(OrderBean.class);
job1.setOutputValueClass(NullWritable.class);
job1.setMapOutputKeyClass(OrderBean.class);
job1.setMapOutputValueClass(NullWritable.class);
//设置map reduce类
job1.setMapperClass(Map.class);
job1.setReducerClass(Reduce.class);
//重点三在这里:嵌套时当前MR的输入路径如果需要上一次MR的数据那么必须使用上一次的输出路径,不能使用输入路径
//设置输入输出路径
FileInputFormat.setInputPaths( job , new Path("D:\\a\\output"));
FileOutputFormat.setOutputPath( job , new Path("D:\\a\\output1"));
boolean b1 = job1.waitForCompletion(true);
//重点四在这里:如果后面不用继续嵌套MR则正常老方法结束,如果有同样的方法继续嵌套
System.exit(b1 == true ? 0 : -1);
}
}