【转】使用JobControl管理mapreduce多job依赖

 

FROM : http://zhenghangcx.iteye.com/blog/1834889

 

当我们在处理mr问题的时候,有时候需求过于复杂,通过一个简单的mr无法达到目的,我们该怎么办呢?

答案是采取JobControl,直接上代码。

Java代码 复制代码 收藏代码
  1. /** 
  2.      * job2 依赖于 job1 
  3.      * @param job1 
  4.      * @param job2 
  5.      * @param chainName 
  6.      * @return 
  7.      * @throws IOException 
  8.      */  
  9.     public static int handleJobChain(Job job1 ,Job job2, String chainName) throws IOException{  
  10.         ControlledJob controlledJob1 = new ControlledJob(job1.getConfiguration());  
  11.         controlledJob1.setJob(job1);  
  12.           
  13.         ControlledJob controlledJob2 = new ControlledJob(job2.getConfiguration());  
  14.         controlledJob2.setJob(job2);  
  15.         controlledJob2.addDependingJob(controlledJob1);  
  16.           
  17.         JobControl jc = new JobControl(chainName);  
  18.         jc.addJob(controlledJob1);  
  19.         jc.addJob(controlledJob2);  
  20.         Thread jcThread = new Thread(jc);  
  21.         jcThread.start();  
  22.         while(true){  
  23.             if(jc.allFinished()){  
  24.                 System.out.println(jc.getSuccessfulJobList());  
  25.                 jc.stop();  
  26.                 return 0;  
  27.             }  
  28.             if(jc.getFailedJobList().size() > 0){  
  29.                 System.out.println(jc.getFailedJobList());  
  30.                 jc.stop();  
  31.                 return 1;  
  32.             }  
  33.         }  
  34.     }  
/**
	 * 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()方法,线程将无法结束。

posted @ 2015-07-06 09:45  MERRU  阅读(204)  评论(0)    收藏  举报