2013-09-03 5 views
1

Я пытаюсь использовать subprocess в сценарии python, который я вызываю в действии оболочки oozie. Subprocess должен читать файл, который хранится в HDFS Hadoop.Подпроцесс Python с oozie

Я использую hadoop-1.2.1 в псевдораспределенном режиме и oozie-3.3.2.

Вот python сценарий, названный connected_subprocess.py:

#!/usr/bin/python 

import subprocess 
import networkx as nx 

liste=subprocess.check_output("hadoop fs -cat /user/root/output-data/calcul-proba/final.txt",shell=True).split('\n') 
G=nx.DiGraph() 
f=open("/home/rlk/liste_strongly_connected.txt","wb") 
for item in liste: 
    try: 
     app1,app2=item.split('\t') 
     G.add_edge(app1,app2) 
    except: 
     pass 
liste_connected=nx.strongly_connected_components(G) 
for item in liste_connected: 
    if len(item)>1: 
     f.write('{}\n'.format('\t'.join(item))) 
f.close() 

Соответствующее действие оболочки в workflow.xml Oozie заключается в следующем:

<action name="final"> 
     <shell xmlns="uri:oozie:shell-action:0.1"> 
      <job-tracker>${jobTracker}</job-tracker> 
      <name-node>${nameNode}</name-node> 
      <configuration> 
       <property> 
        <name>mapred.job.queue.name</name> 
        <value>${queueName}</value> 
       </property> 
      </configuration> 
      <exec>connected_subprocess.py</exec> 
      <file>connected_subprocess.py</file> 
     </shell> 
     <ok to="end" /> 
     <error to="kill" /> 
    </action> 

Когда я запускаю работу oozie журнал TaskTracker читает тезисы ошибок:

Error: Could not find or load main class org.apache.hadoop.fs.FsShell 
Traceback (most recent call last): 
    File "./connected_subprocess.py", line 6, in <module> 
    liste=subprocess.check_output("hadoop fs -cat /user/root/output-data/calcul-proba/final.txt",shell=True).split('\n') 
    File "/usr/lib64/python2.7/subprocess.py", line 575, in check_output 
    raise CalledProcessError(retcode, cmd, output=output) 
subprocess.CalledProcessError: Command 'hadoop fs -cat /user/root/output-data/calcul-proba/final.txt' returned non-zero exit status 1 
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1] 

Это кажется, что я не могу запустить командную строку оболочки в моем скрипте python, когда скрипт python встроен в действие oozie, поскольку все работает отлично, когда я запускаю свой скрипт python в своей интерактивной оболочке.

Есть ли способ обойти это ограничение?

ответ

3

Интересно, не имеет ли ваш сценарий доступа к вашей переменной окружения PATH (когда выполняется через Oozie) и не удается найти команду «hadoop». Можете ли вы попробовать изменить вызов subprocess.check_output на скрипте python и добавить полный путь к команде hadoop fs?

+0

Да, я понял, что это проблема PATH. На самом деле я неправильно установил путь к hadoop для пользователя, который запускал работу oozie. Спасибо за ответ ! –

Смежные вопросы