JobControl 编程实例:
// 为4 个作业分别创建JobConf 对象
JobConf extractJobConf = new JobConf(ExtractJob.class);
JobConf classPriorJobConf = new JobConf(ClassPriorJob.class);
JobConf conditionalProbilityJobConf = new JobConf(ConditionalProbilityJob.class);
JobConf predictJobConf = new JobConf(PredictJob.class);
...// 配置各个JobConf
// 按照依赖关系依次提交作业
JobClient.runJob(extractJobConf);
JobClient.runJob(classPriorJobConf);
JobClient.runJob(conditionalProbilityJobConf);
JobClient.runJob(predictJobConf);
Configuration extractJobConf = new Configuration();
Configuration classPriorJobConf = new Configuration();
Configuration conditionalProbilityJobConf = new Configuration();
Configuration predictJobConf = new Configuration();
...// 设置各个Configuration
// 创建Job 对象。注意,JobControl 要求作业必须封装成Job 对象
Job extractJob = new Job(extractJobConf);
Job classPriorJob = new Job(classPriorJobConf);
Job conditionalProbilityJob = new Job(conditionalProbilityJobConf);
Job predictJob = new Job(predictJobConf);
// 设置依赖关系,构造一个DAG 作业
classPriorJob.addDepending(extractJob);
conditionalProbilityJob.addDepending(extractJob);
predictJob.addDepending(classPriorJob);
predictJob.addDepending(conditionalProbilityJob);
// 创建JobControl 对象,由它对作业进行监控和调度
JobControl JC = new JobControl("Native Bayes");
JC.addJob(extractJob);// 把4 个作业加入JobControl 中
JC.addJob(classPriorJob);
JC.addJob(conditionalProbilityJob);
JC.addJob(predictJob);
JC.run(); // 提交DAG 作业
在实际运行过程中,不依赖于其他任何作业的extractJob 会优先得到调度,一旦运行完成,classPriorJob 和conditionalProbilityJob 两个作业同时被调度,待它们全部运行完成后,predictJob 被调度。
对比以上两种方案,可以得到一个简单的结论:使用JobControl 编写DAG 作业更加简便,且能使多个无依赖关系的作业并行运行。
原文引自《Hadoop技术内幕-深入解析Mapreduce框架设计与实现原理》