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

时间:2013-10-23 08:33:28

标签: java python hadoop jar

我使用hadoop api在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程序的jar ...当执行吐出一些统计数据..我想从python运行这个java jar ...然后捕获这些统计数据...然后修改它们在python中,将这些python统计信息显示给用户。

1 个答案:

答案 0 :(得分:1)

出于多种原因,您希望将shell管道用于此类问题。它使设计视角更加灵活,从python调用进程可能很尴尬,更重要的是管道使python脚本在编程运行时很容易消耗输出。

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

myscript.py通过stdin接收输入,然后通过print正常输出。

请注意,shell命令中的2>&1会将stderr重定向到stdout,因为管道会从stdout而不是stderr移动输出。

相关问题