作业之间有依赖,比如一个作业的输入依赖一个走也的输出,那么这种情况就需要构建作业链来解决。 先看一个简单的示例:
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, 如果有并发执行的话,这个方式也可以,但是不太适合。