내 대학의 일부 컴퓨터 (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에 발행 된 명령이 실제로 실행되지 않는다는 느낌이 들었습니다. 여기에 무슨 일이 일어나고 있는지 디버깅하는 방법에 관해서는 꽤 난처한 편입니다.