从python执行和捕获java执行的输出
我已经使用HadoopAPI用java编写了一个程序。因此,java代码的输出是一个jar。。说foo.jar 要在hadoop中运行这个jar,我需要从python执行和捕获java执行的输出,java,python,hadoop,jar,Java,Python,Hadoop,Jar,我已经使用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会输出大量统计数据
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统计信息。出于多种原因,您希望使用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移动。听起来像是简单的管道