2013-05-29 6 views
0

我想知道是否可以在消息發生時將消息從Hive CLI刷新到stderr。目前,我試圖執行多級查詢(只是一個樣本並非實際):在Python中將多階段作業的HIVE刷新錯誤轉換爲stderr

SELECT COUNT(*) FROM ( 
SELECT user from users 
where datetime = 05-10-2013 
UNION ALL 
SELECT user from users 
where datetime = 05-10-2013 
) a 

這將啓動3個項目,但如果作業1失敗,因爲它被殺死了,我不想跑作業2.目前我的代碼如下所示,但是,除非所有子查詢完成,否則配置單元不會寫入stderr,然後返回錯誤。

def execute_hive_query(query): 
    return_code = None 
    cmd = ["hive", "-e", query] 
    proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    while return_code is None: 
     out = proc.stdout.read() 
     error = proc.stderr.read() 
     handle_hive_exception(out,error) 
     time.sleep(10) 
     return_code = proc.poll() 

def handle_hive_exception(stdout,stderr): 
     if stderr != '': 
     raise Exception(stderr) 

謝謝!

+0

'.stdout.read()'會阻塞,直到子進程關閉通常在子進程退出時發生的stdout。您需要使用[threads或select.select或fctnl等](http://stackoverflow.com/q/375427/4279)實現的非阻塞式讀取。另外,你可能會遇到[block buffering issue](http://stackoverflow.com/a/12471855/4279)。 – jfs

回答

0

我懷疑查詢的各個階段是並行執行的。如果它們被串行執行,那麼一個將會導致整個作業失敗。

嘗試在您的查詢中設置hive.exec.parallel=false

+0

沒有工作,同樣的問題。即使它確實有效,也不會長期解決,因爲我希望查詢能夠並行運行。我只是想將錯誤刷新到標準錯誤。我在Hive的Jira上打開了一個問題:https://issues.apache.org/jira/browse/HIVE-4631 –

相關問題