2012-10-23 2 views
1

다른 워크 플로우를 시작하는 자바 코드가있는 워크 플로를 실행하고 있습니다. 기본 워크 플로는 정상적으로 작동하지만 Java 코드에서 시작된 워크 플로는 항상 일시 중단 상태입니다. 나는 그것을 위해 사용자가지도로 나타 내기 때문에 그것을 재개 할 수 없다. 어떤 생각이 문제 일 수 있습니까?워크 플로에서 Java 코드가 일시 중단되었습니다.

여기

<java> 
     <job-tracker>${jobTracker}</job-tracker> 
     <name-node>${nameNode}</name-node> 
     <main-class>com.last.play.LaunchJob</main-class> 
     <arg>currentUser=${currentUser}</arg> 
    </java> 

내 주요 워크 플로우

그리고 여기에 자바 코드입니다 :

Map<String, String> commandArgs = getActionArgs(args); 

    Path appPropertyPath = new Path("/user/cmahajan/app.properties"); 
    Path jobPropertyPath = new Path("/user/cmahajan/job.properties"); 
    OozieClient wc = new OozieClient("http://host07.com:11000/oozie"); 

    String userName = commandArgs.get("currentUser"); 
    System.out.println("User Name recieved ::" + userName); 
    Configuration trial = new Configuration(); 
    FileSystem fs = FileSystem.get(trial); 

    Properties conf = wc.createConfiguration(); 
    Properties jobProperties = new Properties(); 
    Properties appProperties = new Properties(); 
    appProperties.load(fs.open(appPropertyPath)); 
    String version = appProperties.getProperty("version"); 
    jobProperties.load(fs.open(jobPropertyPath)); 

    for (Object key : jobProperties.keySet()) { 
     String propValue = jobProperties.getProperty((String) key); 
     propValue = propValue.replaceAll("\\$\\{user.name\\}", userName); 
     conf.setProperty((String) key, propValue); 
     System.out.println("Key ::" + key); 
     System.out.println("Value ::" + propValue); 
     System.out.println(" ==================="); 
    } 
    String appsRoot = "${wfsBasePath}/" + version + "/apps"; 
    conf.setProperty("appsRoot", appsRoot); 
    try { 
     String jobId = wc.run(conf); 

     System.out.println("Workflow job submitted"); 

     while (wc.getJobInfo(jobId).getStatus() == WorkflowJob.Status.RUNNING) { 
      System.out.println("Workflow job running ..."); 
      Thread.sleep(10 * 1000); 
     } 
     System.out.println("Workflow job completed ..."); 
     System.out.println(wc.getJobInfo(jobId)); 
    } catch (OozieClientException oozieClientException) { 
     oozieClientException.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

답변

0

당신은 사용자가 설정 UserGroupInformation를 사용할 수 있습니다.

UserGroupInformation ugi = UserGroupInformation.createRemoteUser(username); 
ugi.doAs(new PrivilegedExceptionAction<MyMapReduceWrapperClass>() { 
public Object run() throws Exception { 
    MyMapReduceWrapperClass mr = new MyMapReduceWrapperClass(); 
    ToolRunner.run(mr, null); 
    return mr; 
} 
}); 
관련 문제