我使用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统计信息显示给用户。
答案 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移动输出。