通过java Processbuilder提交的mapreduce作业未结束
我有一个mareduce作业作为jar文件,比如“mapred.jar”。实际上Jobtracker是在远程linux机器上运行的。我在本地机器上运行jar文件,jar文件中的作业被提交到远程jobtracker,工作正常,如下所示:通过java Processbuilder提交的mapreduce作业未结束,java,hadoop,process,mapreduce,Java,Hadoop,Process,Mapreduce,我有一个mareduce作业作为jar文件,比如“mapred.jar”。实际上Jobtracker是在远程linux机器上运行的。我在本地机器上运行jar文件,jar文件中的作业被提交到远程jobtracker,工作正常,如下所示: java -jar F:/hadoop/mapred.jar ProcessBuilder pb = new ProcessBuilder("java", "-jar", "F:/hadoop/mapred.jar"); pb.directory(new
java -jar F:/hadoop/mapred.jar
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "F:/hadoop/mapred.jar");
pb.directory(new File("D:/test"));
final Process process = pb.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("Waited for: "+ process.waitFor());
System.out.println("Program terminated! ");
但当我通过java的ProcessBuilder执行相同操作时,如下所示:
java -jar F:/hadoop/mapred.jar
ProcessBuilder pb = new ProcessBuilder("java", "-jar", "F:/hadoop/mapred.jar");
pb.directory(new File("D:/test"));
final Process process = pb.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("Waited for: "+ process.waitFor());
System.out.println("Program terminated! ");
它也起作用了,我可以通过,http://192.168.1.112:50030/jobtracker.jsp
问题
我的问题是,即使mapreduce作业完成,java程序也不会无限期运行!。此外,我没有通过命令行获得任何输出消息。我如何知道作业已完成?在开始阅读之前,您可能应该将stderr重定向到stdout:
pb.redirectErrorStream(true)
原因在过程类的文档中描述:
。。。未能及时写入子流程的输入流或读取子流程的输出流可能会导致子流程阻塞,甚至死锁
如果您使用的是Java7,ProcessBuilder和Process都得到了显著改进,那么您也可以这样做
pb.inheritIO()
这将把进程的stderr和stdout重定向到Java进程的stderr和stdout
更新:顺便说一句,您最好使用Hadoop API(类作业和配置)提交Hadoop作业,请参见