MapReduce如何多层嵌套

在学习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);
			
		}
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值