Hadoop 依赖关系作业 MapReduce JobControl 错误纠正

最近要写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类添加作业有两个单参数方法:
addJob(ControlledJob aJob)  
addJob(Job aJob)  
咋一看没有问题啊,的确是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起码要编译通过,想当然害死人啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值