从python执行和捕获java执行的输出

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

我用hadoopapi编写了一个java程序。所以,java代码的输出是一个jar。。说foo.jar
在hadoop中运行jar,我需要

hadoop jar foo.jar org.foo.bar.MainClass input output

这就开始了一个很长的hadoop任务(比如说几分钟)。
作业正在运行时。。hadoop给了我进步。。喜欢

Map 0%, Reduce 0%
Map 20%, Reduce 0%
....

以此类推。。作业结束后,hadoop会吐出一堆统计数据(比如输入大小、拆分、记录等等)。。所有这些都是从命令行完成的。。
现在,我想做的是。。从python调用这个程序(使用简单的系统执行..)
但我想要的是。。当我运行这个python代码时。。我还想展示一些统计数据…但不是全部。。
所以,我要寻找的是一种捕获这些由jar执行显示的统计信息的方法,并在python中处理它,然后显示处理过的统计信息。。
例如..默认情况下,hadoop显示。。

Map 0%, Reduce 0%
Map 20%, Reduce 0%

...
以此类推。。
也许我所拥有的是。。。

def progress_function(map,reduce):

      return sum([map,reduce])/2.0

我在命令提示符上显示。。

progress so far:0
progress so far:10

and so on..

长话短说。。我有一罐java程序。。当它被执行时会吐出一些数据。。我想从python运行这个java jar。。然后获取这些数据。。。然后在python中修改它们并向用户显示这些python统计信息。

pqwbnv8z

pqwbnv8z1#

出于多种原因,您希望使用壳管来解决此类问题。从设计Angular 来看,它更加灵活,从python调用进程可能会很尴尬,更重要的是,管道使python脚本在编程运行时很容易使用输出。

hadoop jar foo.jar org.foo.bar.MainClass input output 2>&1 | python myscript.py

myscript.py 通过接收输入 stdin 正常输出 print .
请注意 2>&1 在shell中,命令将stderr重定向到stdout,因为管道从stdout而不是stderr移动输出。

相关问题