Я пытаюсь использовать subprocess
в сценарии python
, который я вызываю в действии оболочки oozie
. Subprocess
должен читать файл, хранящийся в HDFS Hadoop.
Я использую hadoop-1.2.1 в псевдораспределенном режиме и oozie-3.3.2.
Вот python
script с именем 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 в своей интерактивной оболочке.
Можно ли как-то обойти это ограничение?