2013-10-23 32 views
4

我寫使用Hadoop API中的java程序捕獲Java執行的輸出。所以,該Java代碼的輸出是一個jar ..說foo.jar中執行並從蟒

要運行在Hadoop中那個罐子,我做

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

而這個開始很長的Hadoop任務(比如幾分鐘)。

當作業運行.. Hadoop的給我的進步..像

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

等..作業結束後 ,Hadoop的吐出一堆統計數據(如輸入大小,分割,記錄等).. 所有這一切都是在命令行做..

現在,我試圖做的是..叫蟒蛇這個程序(用簡單的系統執行。)

但我想要的是..當我運行這個python代碼..我也想展示一些這些statistics..but不是所有的..

所以,我在找的是一個方式來捕捉這些統計數據正在被由罐子執行和內部處理它顯示Python和顯示器處理統計..

對於example..By默認情況下,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統計數據顯示給用戶。

+2

聽起來像簡單管道 – Leifingson

回答

1

你想使用shell管道對這類問題的原因很多。它使得它更加靈活,從設計的角度來看,從python調用進程可能會很笨拙,更重要的是,管道使python腳本可以在編程運行時消耗輸出。

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

必須通過stdinmyscript.py取輸入和通常與print只輸出。

注意,在外殼命令的2>&1 stderr重定向到stdout因爲管道從標準輸出,而不是stderr的移動的輸出。