当MapReduce中作业不止一个,如果管理这些作业按照顺序执行,主要考虑是否有个线性的作业链或有向无环图(DAG)
对于线性链表最简单的就是一个接一个的运行作业,对于比线性链表更复杂的结构,有相关的类库可以帮助你合理安排工作流,最简单的就是org.apache.hadoop.mapred.jobcontrol包中的JobControl类,JobControl实例代表一个作业的运行图,可以加入作业配置,然后告诉JobControl实例作业之间的依赖关系
示例如下:
Java代码
- /**
- * job2 依赖于 job1
- * @param job1
- * @param job2
- * @param chainName
- * @return
- * @throws IOException
- */
- public static int handleJobChain(Job job1 ,Job job2, String chainName) throws IOException{
- ControlledJob controlledJob1 = new ControlledJob(job1.getConfiguration());
- controlledJob1.setJob(job1);
- ControlledJob controlledJob2 = new ControlledJob(job2.getConfiguration());
- controlledJob2.setJob(job2);
- controlledJob2.addDependingJob(controlledJob1);
- JobControl jc = new JobControl(chainName);
- jc.addJob(controlledJob1);
- jc.addJob(controlledJob2);
- Thread jcThread = new Thread(jc);
- jcThread.start();
- while(true){
- if(jc.allFinished()){
- System.out.println(jc.getSuccessfulJobList());
- jc.stop();
- return 0;
- }
- if(jc.getFailedJobList().size() > 0){
- System.out.println(jc.getFailedJobList());
- jc.stop();
- return 1;
- }
- }
- }
要注意的地方就是
hadoop的JobControl类实现了线程Runnable接口
。我们
需要实例化一个线程来让它启动
。
直接调用JobControl的run()方法,线程将无法结束
。