在Oozie中运行python脚本时如何导入本地python模块?

时间:2016-04-25 18:11:15

标签: python hdfs oozie

我有两个python文件 - my_python_A.py和my_python_B.py。第一个文件引用第二个文件(from my_python_B import *)。

我在Oozie的shell操作中执行第一个python文件(即脚本只是python my_python_A.py),并且收到以下错误:

Traceback (most recent call last):
  File "my_python_A.py", line 2, in <module>
    from my_python_B import *
ImportError: No module named my_python_B
Failing Oozie Launcher, Main class [org.apache.oozie.action.hadoop.ShellMain], exit code [1]

两个python文件都位于HDFS中的同一目录下。我怎样才能使这个import语句起作用?

2 个答案:

答案 0 :(得分:7)

我遇到了同样的问题,我解决这个问题的方法是在执行我的python代码之前将环境变量PYTHONPATH设置为shell脚本中的当前工作目录

export PYTHONPATH=`pwd`
python m_python_A.py

确保在shell操作中已包含<file></file>标记内的所有必需python模块。假设您有一个名为sample_script.sh的shell脚本(在其中有上述命令),您的workflow.xml文件看起来应该是这样的

<workflow-app name="shellTest" xmlns="uri:oozie:workflow:0.4">
    <start to="shell-action"/>
    <action name="shell-action">
        <shell xmlns="uri:oozie:shell-action:0.2">
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <configuration>                
                <property>
                    <name>oozie.launcher.mapred.job.queue.name</name>
                    <value>${launcherqueue}</value>
                </property>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${mapredqueue}</value>
                </property>
            </configuration>
            <exec>sample_script.sh</exec>
            <file>${appPath}/sample_script.sh#sample_script.sh</file>
            <file>${appPath}/m_python_A.py#m_python_A.py</file>
            <file>${appPath}/m_python_B.py#m_python_B.py</file>
            <capture-output/>
        </shell>
        <ok to="end"/>
        <error to="shell-action-failed"/>
    </action>

    <kill name="shell-action-failed">
        <message>Shell action failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>

    <end name="end" />

</workflow-app>

答案 1 :(得分:0)

如何添加

sys.path.append(os.path.join(os.path.dirname(__file__), "lib"))
在你的m_python_A.py中

访问存储到(I.E.)lib /?

中的任何内容