2016-12-12 2 views
0

내 대학의 일부 컴퓨터 (Linux Fedora 25를 실행하는 모든 컴퓨터)에서 Hadoop YARN 클러스터를 설정했습니다. YARN에서지도 작업을 실행할 때 별도의 프로그램으로 전화를 걸면 출력을받을 수 없습니다. 흥미롭게도 필자가 로컬로 작업 (mapred-site.xml에서 구성)을 실행하면 프로그램을 호출하고 출력을받는 방법이 잘 작동합니다. 아래는 내 executeShellCommand 클래스입니다.이 클래스는 첫 번째 맵 작업에서 인스턴스화되고 사용됩니다. 나는 확실히 만든YARN 작업에서 ProcessBuilder 출력을받지 못함

public class ExecuteShellCommand { 


    public String executeCommand(String command) { 

     StringBuffer output = new StringBuffer(); 
     Process p; 
     try { 
      String [] args = command.split(" "); 
      String cmd = args[0]; 
      ProcessBuilder pb = new ProcessBuilder().command(cmd, args[1], args[2], args[3], args[4], args[5], args[6], args[7]).directory(new File("path to executable")); 
      p = pb.start(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      p.waitFor(); 
      String line = ""; 
      while ((line = reader.readLine())!= null) { 
       output.append(line + "\n"); 

      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
      return e.toString(); 
      } 
    return output.toString(); 

    } 

} 

확인 사항 :

1) 권한이 적절하게 필요한 모든 파일/디렉토리에 대한 설정

이지도 작업은 현재 사용자로 실행된다) (나), 그래서 아무 불법적 인 접근

3) 내가 파일을 수신하지 못하는 문제가 예외를 찾을 수없는, 그래서 전화 했어 프로그램의 경로가 올바른지

4)의 I를 검사 프로세스 p에 대한 nput/output stream ([email protected]으로 설정된 입력 스트림, 출력 스트림이 null 임)

5) 대신 프로그램을 호출하면 간단한 "echo "명령을 받았고 그 출력도 수신 할 수 없었습니다.

6) 나는 또한

p = Runtime.getRuntime().exec("myCommand") 

를 사용하여 시도했지만 결과는 (더 출력이받지 않음) 이미 언급 한 바와 같이

, 내가 로컬 작업을 실행할 때, 내 ExecuteCommand를 방법 기능을 완벽하게 동일합니다 , 내가 호출 한 프로그램의 출력을 반환합니다. YARN에서만 문제가 발생합니다. 문제가 올바른 버퍼에서 읽지 못하거나 ProcessBuilder에 발행 된 명령이 실제로 실행되지 않는다는 느낌이 들었습니다. 여기에 무슨 일이 일어나고 있는지 디버깅하는 방법에 관해서는 꽤 난처한 편입니다.

답변

0

여러 가지 솔루션을 시도해 본 끝에 ProcessBuilder로 생성 된 프로세스에서 오류 스트림을 얻는 방법을 알아 냈습니다. 프로세스의 작업 디렉토리를 설정했을 때, 내가 전달한 인수 중 하나에 대한 경로를 업데이트하는 것을 잊어 버렸습니다. D' oh !!!