Подпроцесс Python с oozie

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

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

Вот pythonscript с именем 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 в своей интерактивной оболочке.

Можно ли как-то обойти это ограничение?


person Raphael_LK    schedule 03.09.2013    source источник


Ответы (1)


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

person Joe Young    schedule 03.09.2013
comment
Да, я сам понял, что это проблема PATH. На самом деле я неправильно указал путь к hadoop для пользователя, который запустил задание oozie. Спасибо за ответы ! - person Raphael_LK; 04.09.2013