4

我使用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 统计信息。

4

1 回答 1

1

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

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

通过myscript.py输入stdin并正常输出print

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

于 2013-10-23T16:42:06.487 回答