我有一个 mareduce 工作作为 jar 文件,说'mapred.jar'。实际上,Jobtracker在远程Linux机器中运行。我从本地机器运行 jar 文件,jar 文件中的作业已提交到远程作业跟踪器,它工作正常,如下所示:
java -jar F:/hadoop/mapred.jar
13/12/19 12:40:27 WARN mapred.JobClient: Use GenericOptionsParser for parsing th
e arguments. Applications should implement Tool for the same.
13/12/19 12:40:27 INFO input.FileInputFormat: Total input paths to process : 49
13/12/19 12:40:27 WARN util.NativeCodeLoader: Unable to load native-hadoop libra
ry for your platform... using builtin-java classes where applicable
13/12/19 12:40:27 WARN snappy.LoadSnappy: Snappy native library not loaded
13/12/19 12:40:28 INFO mapred.JobClient: Running job: job_201312160716_0063
13/12/19 12:40:29 INFO mapred.JobClient: map 0% reduce 0%
13/12/19 12:40:50 INFO mapred.JobClient: map 48% reduce 0%
13/12/19 12:40:53 INFO mapred.JobClient: map 35% reduce 0%
13/12/19 12:40:56 INFO mapred.JobClient: map 29% reduce 0%
13/12/19 12:41:02 INFO mapred.JobClient: map 99% reduce 0%
13/12/19 12:41:08 INFO mapred.JobClient: map 100% reduce 0%
13/12/19 12:41:23 INFO mapred.JobClient: map 100% reduce 100%
13/12/19 12:41:28 INFO mapred.JobClient: Job complete: job_201312160716_0063
...
但是当我通过java的ProcessBuilder执行相同的操作时,如下所示:
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
查看作业状态。
问题
我的问题是,java程序不会结束,即使mapreduce作业完成,也不会无限期运行!此外,我没有收到通过命令行获得的任何输出消息。我怎么知道工作已经完成?
在开始阅读之前,您可能应该将stderr重定向到stdout:
pb.redirectErrorStream(true)
Process 类的文档描述了原因:
。未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。
如果你使用的是Java 7,其中ProcessBuilder和Process得到了显着改进,你也可以这样做。
pb.inheritIO()
这会将进程的 stderr 和 stdout 重定向到 Java 进程的 stderr。
更新:顺便说一下,你最好使用Hadoop API(类作业和配置)提交Hadoop作业,例如从一个简单的java程序调用mapreduce作业