Мне было интересно, можно ли сбросить сообщения из CLI Hive в stderr по мере их возникновения. В настоящее время я пытаюсь выполнить запрос многоступенчатого (только образец не фактический):Ошибки слияния в отношении многоуровневых задач для stderr в Python
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 терпит неудачу, потому что он был убит, я не хочу работать job 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)
Спасибо!
'.stdout.read()' будет блокироваться до тех пор, пока подпроцесс не завершит свою стандартную остановку, которая обычно возникает, когда подпроцесс завершается. Вам нужно неблокирующее чтение, которое может быть реализовано с помощью [threads, select.select, или fctnl и т. Д.] (Http://stackoverflow.com/q/375427/4279). Кроме того, вы можете столкнуться с проблемой буферизации блоков (http://stackoverflow.com/a/12471855/4279). – jfs