[英]mapreduce job submission through java Processbuilder do not ending
我有一個mareduce作業,如jar文件,說“ mapred.jar”。實際上,Jobtracker在遠程Linux機器上運行。 我從本地計算機運行jar文件,jar文件中的作業被提交到遠程jobtracker,它的工作原理如下:
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
查看作業狀態。
問題
我的問題是, 即使mapreduce作業完成 , Java程序也不會無限期運行 ! 我也沒有收到通過命令行得到的任何輸出消息。我怎么知道工作完成了?
開始閱讀之前,您可能應該將stderr重定向到stdout:
pb.redirectErrorStream(true)
原因在Process類的文檔中進行了描述:
...未能及時寫入子流程的輸入流或讀取子流程的輸出流可能導致子流程阻塞,甚至死鎖。
如果您使用的Java 7顯着改進了ProcessBuilder和Process,那么您也可以
pb.inheritIO()
這會將進程的stderr和stdout重定向到您的Java進程。
更新:順便說一句,最好使用Hadoop API提交Hadoop作業(類Job和Configuration),請參見例如, 從簡單的Java程序調用mapreduce作業
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.