Mapreduce作业链

作业之间有依赖,比如一个作业的输入依赖一个走也的输出,那么这种情况就需要构建作业链来解决。 先看一个简单的示例:

	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {

		Configuration conf = new Configuration();
		Job job = Job.getInstance(conf, "MarketBasketAnalysis");
		job.setJarByClass(MarketBasketAnalysis.class);
		job.setMapperClass(TokenizerMapper.class);
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(IntWritable.class);
		job.setReducerClass(IntSumReducer.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(IntWritable.class);
		job.setNumReduceTasks(1);
		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));
		job.waitForCompletion(true);
		
		Job job1 = Job.getInstance(conf, "MarketBasketAnalysis1");
		job1.setJarByClass(MarketBasketAnalysis.class);
		job1.setMapperClass(TokenizerMapper_1.class);
		job1.setMapOutputKeyClass(Text.class);
		job1.setMapOutputValueClass(IntWritable.class);
		job1.setReducerClass(IntSumReducer_1.class);
		job1.setOutputKeyClass(Text.class);
		job1.setOutputValueClass(IntWritable.class);
		FileInputFormat.addInputPath(job1, new Path(args[1]));
		FileOutputFormat.setOutputPath(job1, new Path(args[2]));

		System.exit(job1.waitForCompletion(true) ? 0 : 1);

	}

上面有2个JOB, job1的输入依赖job的输出, 我们仔细看是怎么构建的,其实不过就是依次顺序执行而已, 每个JOB有自己的map和reduce,仅仅是输入和输出有区别。

这里要说明一下,上面的job仅仅是等待完成,并没有去判断是否成功,很多时候,我们希望 job如果成功了,才继续走下去,如果失败了就System.exit,那个地方加个判断即可。

这种依赖适合A成功执行B,B成功再执行C, 如果有并发执行的话,这个方式也可以,但是不太适合。

猜你喜欢

转载自blog.csdn.net/tom_fans/article/details/78393937
今日推荐