最近要写MapReduce工作流,查了下书籍和资料,使用了JobControl,但是出现了明显的语法问题。
先贴一段广泛流传的code:
Job job1 = new Job();
//使用新版api的Job类,三种声明方式都会抛方法过时警告
Job job2 = new Job();
Job job3 = new Job();
//...省略job声明
//添加job依赖关系
job2.addDependingJob(job1);
job3.addDependingJob(job2);
//新建一个job控制器
JobControl JC = new JobControl("My Job Control");
JC.addJob(job1);
JC.addJob(job2);
JC.addJob(job3);
JC.run();
看上去很正常很美好,但是你把它放到IDE中就会发现
JC.addJob(Job ajob);
方法报错,参数Job不能转换成ControlledJob。
看上去很正常,其实是错误的。去查下Hadoop的API:
JobControl类添加作业有两个单参数方法:
咋一看没有问题啊,的确是Job类。
但是MapReduce中的Job类有好几个,我们看看这里的Job类是什么:
org.apache.hadoop.mapred.jobcontrol.Job
看到了,原来这里的Job是旧版api中的Job,不是新版api中的基础作业Job。So,
旧版api中基础作业使用jobConf,受控作业使用Job;
新版api中基础作业使用Job,受控作业使用ContorlledJob。
所以既然我们使用新版api来编写依赖关系作业流,代码要这么写:
//创建基础作业
Job job1 = new Job();
Job job2 = new Job();
Job job3 = new Job();
//...省略作业参数配置
//创建受控作业
ControlledJob cjob1 = new ControlledJob(new Configuration());
ControlledJob cjob2 = new ControlledJob(new Configuration());
ControlledJob cjob3 = new ControlledJob(new Configuration());
//将普通作业包装成受控作业
cjob1.setJob(job1);
cjob2.setJob(job2);
cjob3.setJob(job3);
//设置依赖关系
cjob2.addDependingJob(cjob1);
cjob3.addDependingJob(cjob2);
//新建作业控制器
JobControl jc = new JobControl("My job control");
//将受控作业添加到控制器中
jc.addJob(cjob1);
jc.addJob(cjob2);
jc.addJob(cjob3);
jc.run();
PS:写技术文章必须要严谨,code起码要编译通过,想当然害死人啊!