mapreduce通过java processbuilder提交作业不结束

wz3gfoph  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(375)

我有一个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程序也不会无限期地运行!。我也没有得到任何输出消息,我通过命令行得到。我怎么知道工作得到完成?

vhmi4jdf

vhmi4jdf1#

在开始阅读之前,您可能应该将stderr重定向到stdout:

pb.redirectErrorStream(true)

原因在process类的文档中描述:
... 未能及时写入子进程的输入流或读取子进程的输出流可能会导致子进程阻塞,甚至死锁。
如果您使用的是Java7,processbuilder和process得到了显著改进,那么您也可以这样做

pb.inheritIO()

它将进程的stderr和stdout重定向到java进程的stderr和stdout。
更新:顺便说一下,您最好使用hadoopapi(类作业和配置)提交hadoop作业,请参见例如,从简单java程序调用mapreduce作业

相关问题