복붙노트

[HADOOP] oozie를 사용한 Python 하위 프로세스

HADOOP

oozie를 사용한 Python 하위 프로세스

oozie shell 액션 내에서 호출하는 파이썬 스크립트에서 하위 프로세스를 사용하려고합니다. 하위 프로세스는 Hadoop의 HDFS에 저장된 파일을 읽어야합니다.

의사 분산 모드와 oozie-3.3.2에서 hadoop-1.2.1을 사용하고 있습니다.

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()

Oozie의 workflow.xml에서 해당 셸 동작은 다음과 같습니다.

 <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 작업을 실행하면 작업 추적기 로그에 다음 오류가 표시됩니다.

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]

파이썬 스크립트가 oozie 액션 내에 포함되어 있으면 파이썬 스크립트 내에서 쉘 명령 줄을 실행할 수없는 것 같습니다. 대화 형 쉘 내에서 파이썬 스크립트를 실행할 때 모든 것이 잘 작동하기 때문입니다.

이 제한을 무시할 수있는 방법이 있습니까?

해결법

  1. ==============================

    1.스크립트가 PATH 환경 변수 (Oozie를 통해 실행될 때)에 액세스 할 수없고 "hadoop"명령을 찾는 데 문제가 있는지 궁금합니다. 파이썬 스크립트의 subprocess.check_output 호출을 수정하고 hadoop fs 명령의 전체 경로를 추가 할 수 있습니까?

    스크립트가 PATH 환경 변수 (Oozie를 통해 실행될 때)에 액세스 할 수없고 "hadoop"명령을 찾는 데 문제가 있는지 궁금합니다. 파이썬 스크립트의 subprocess.check_output 호출을 수정하고 hadoop fs 명령의 전체 경로를 추가 할 수 있습니까?

  2. from https://stackoverflow.com/questions/18588495/python-subprocess-with-oozie by cc-by-sa and MIT license